Regenerated documentation Used new Doxygen 1.9.1
diff --git a/docs/html/allocation_annotation.html b/docs/html/allocation_annotation.html index cf72ea1..ca4a557 100644 --- a/docs/html/allocation_annotation.html +++ b/docs/html/allocation_annotation.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Allocation names and user data</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -84,10 +84,19 @@ <div class="line">VkBuffer buffer;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2918</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> </div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p> <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &allocInfo);</div> <div class="line">MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div> +<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3246</div></div> +<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3295</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div> </div><!-- fragment --><p>It can also be changed using function <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>.</p> <p>Values of (non-zero) allocations' <code>pUserData</code> are printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>, in hexadecimal form.</p> <h1><a class="anchor" id="allocation_names"></a> @@ -107,6 +116,9 @@ <div class="line">VkImage image;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(allocator, &imageInfo, &allocCreateInfo, &image, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2824</div></div> </div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p> <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &allocInfo);</div> @@ -116,21 +128,9 @@ <dl class="section note"><dt>Note</dt><dd>Passing string name to VMA allocation doesn't automatically set it to the Vulkan buffer or image created with it. You must do it manually using an extension like VK_EXT_debug_utils, which is independent of this library. </dd></dl> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2781</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2875</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer().</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3217</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2838</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3173</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 4725674..5d50e51 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Class List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -93,7 +93,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/choosing_memory_type.html b/docs/html/choosing_memory_type.html index 63ebe12..db95c57 100644 --- a/docs/html/choosing_memory_type.html +++ b/docs/html/choosing_memory_type.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Choosing memory type</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -93,6 +93,11 @@ <div class="line">VkBuffer buffer;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> </div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a> Required and preferred flags</h1> <p>You can specify more detailed requirements by filling members <a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90" title="Flags that must be set in a Memory Type chosen for an allocation.">VmaAllocationCreateInfo::requiredFlags</a> and <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d" title="Flags that preferably should be set in a memory type chosen for an allocation.">VmaAllocationCreateInfo::preferredFlags</a> with a combination of bits from enum <code>VkMemoryPropertyFlags</code>. For example, if you want to create a buffer that will be persistently mapped on host (so it must be <code>HOST_VISIBLE</code>) and preferably will also be <code>HOST_COHERENT</code> and <code>HOST_CACHED</code>, use following code:</p> @@ -104,6 +109,10 @@ <div class="line">VkBuffer buffer;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2897</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2892</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2798</div></div> </div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p> <p>If you use <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory.">VmaAllocationCreateInfo::usage</a>, it is just internally converted to a set of required and preferred flags.</p> <h1><a class="anchor" id="choosing_memory_type_explicit_memory_types"></a> @@ -118,6 +127,7 @@ <div class="line">VkBuffer buffer;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2905</div></div> </div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a> Custom memory pools</h1> <p>If you allocate from custom memory pool, all the ways of specifying memory requirements described above are not applicable and the aforementioned members of <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure are ignored. Memory type is selected explicitly when creating the pool and then used to make all the allocations from that pool. For further details, see <a class="el" href="custom_memory_pools.html">Custom memory pools</a>.</p> @@ -131,19 +141,9 @@ </ul> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2849</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2755</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2838</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2854</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2862</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/classes.html b/docs/html/classes.html index 64fc825..e63f3fa 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Class Index</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -65,43 +65,16 @@ <div class="title">Class Index</div> </div> </div><!--header--> <div class="contents"> -<div class="qindex"><a class="qindex" href="#letter_v">v</a></div> -<table class="classindex"> -<tr><td rowspan="2" valign="bottom"><a name="letter_v"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  v  </div></td></tr></table> -</td> -<td valign="top"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>   </td> -<td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>   </td> -</tr> -<tr><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>   </td> -<td valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>   </td> -<td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>   </td> -</tr> -<tr><td valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>   </td> -<td valign="top"><a class="el" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>   </td> -</tr> -<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_budget.html">VmaBudget</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>   </td> -<td></td></tr> -<tr><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>   </td> -<td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>   </td> -<td valign="top"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>   </td> -<td></td></tr> -<tr><td></td><td></td><td></td><td></td><td></td></tr> -</table> -<div class="qindex"><a class="qindex" href="#letter_v">v</a></div> +<div class="qindex"><a class="qindex" href="#letter_V">V</a></div> +<div class="classindex"> +<dl class="classindex even"> +<dt class="alphachar"><a name="letter_V">V</a></dt> +<dd><a class="el" href="struct_vma_allocation.html">VmaAllocation</a></dd><dd><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></dd><dd><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a></dd><dd><a class="el" href="struct_vma_allocator.html">VmaAllocator</a></dd><dd><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></dd><dd><a class="el" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></dd><dd><a class="el" href="struct_vma_budget.html">VmaBudget</a></dd><dd><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></dd><dd><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></dd><dd><a class="el" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a></dd><dd><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></dd><dd><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></dd><dd><a class="el" href="struct_vma_pool.html">VmaPool</a></dd><dd><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></dd><dd><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a></dd><dd><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></dd><dd><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a></dd><dd><a class="el" href="struct_vma_stats.html">VmaStats</a></dd><dd><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></dd></dl> +</div> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/configuration.html b/docs/html/configuration.html index 721d735..555858a 100644 --- a/docs/html/configuration.html +++ b/docs/html/configuration.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Configuration</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -95,7 +95,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/custom_memory_pools.html b/docs/html/custom_memory_pools.html index 1e30c39..ef50582 100644 --- a/docs/html/custom_memory_pools.html +++ b/docs/html/custom_memory_pools.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Custom memory pools</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -105,9 +105,21 @@ <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div> <div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2911</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3246</div></div> +<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3047</div></div> +<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3050</div></div> +<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3075</div></div> +<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> </div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p> <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buf, alloc);</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(allocator, pool);</div> +<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div> </div><!-- fragment --><h1><a class="anchor" id="custom_memory_pools_MemTypeIndex"></a> Choosing memory type index</h1> <p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use helper functions <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo.">vmaFindMemoryTypeIndexForImageInfo()</a>. You need to provide structures with example parameters of buffers or images that you are going to create in that pool.</p> @@ -124,6 +136,9 @@ <div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div> <div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div> <div class="line"><span class="comment">// ...</span></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div> </div><!-- fragment --><p>When creating buffers/images allocated in that pool, provide following parameters:</p> <ul> <li><code>VkBufferCreateInfo</code>: Prefer to pass same parameters as above. Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior. Using different <code>VK_BUFFER_USAGE_</code> flags may work, but you shouldn't create images in a pool intended for buffers or the other way around.</li> @@ -180,24 +195,9 @@ </ul> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="astruct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3000</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2868</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory.</div></div> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object.</div></div> -<div class="ttc" id="astruct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3025</div></div> -<div class="ttc" id="astruct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2997</div></div> -<div class="ttc" id="astruct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3173</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/debugging_memory_usage.html b/docs/html/debugging_memory_usage.html index 7ab422d..ce21667 100644 --- a/docs/html/debugging_memory_usage.html +++ b/docs/html/debugging_memory_usage.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Debugging incorrect memory usage</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -106,7 +106,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/defragmentation.html b/docs/html/defragmentation.html index 3ea8256..1320787 100644 --- a/docs/html/defragmentation.html +++ b/docs/html/defragmentation.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Defragmentation</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,7 +73,7 @@ <p>To mitigate this problem, you can use defragmentation feature: structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a>, function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>, <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</a>. Given set of allocations, this function can move them to compact used memory, ensure more continuous free space and possibly also free some <code>VkDeviceMemory</code> blocks.</p> <p>What the defragmentation does is:</p> <ul> -<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</li> +<li>Updates <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> objects to point to new <code>VkDeviceMemory</code> and offset. After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object.">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset in VkDeviceMemory object to the beginning of this allocation, in bytes. (deviceMemory,...">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</li> <li>Moves actual data in memory.</li> </ul> <p>What it doesn't do, so you need to do it yourself:</p> @@ -120,15 +120,28 @@ <div class="line"> <span class="comment">// Create new buffer with same parameters.</span></div> <div class="line"> VkBufferCreateInfo bufferInfo = ...;</div> <div class="line"> vkCreateBuffer(device, &bufferInfo, <span class="keyword">nullptr</span>, &buffers[i]);</div> -<div class="line"> </div> +<div class="line"> </div> <div class="line"> <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div> -<div class="line"> </div> +<div class="line"> </div> <div class="line"> <span class="comment">// Bind new buffer to new memory region. Data contained in it is already moved.</span></div> <div class="line"> <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div> <div class="line"> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &allocInfo);</div> <div class="line"> <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div> <div class="line"> }</div> <div class="line">}</div> +<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3246</div></div> +<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> +<div class="ttc" id="astruct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process.</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3645</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3651</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3666</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3695</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3660</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3690</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div> </div><!-- fragment --><p>Setting <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> is optional. This output array tells whether particular allocation in <a class="el" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> at the same index has been modified during defragmentation. You can pass null, but you then need to query every allocation passed to defragmentation for new parameters using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you might need to recreate and rebind a buffer or image associated with it.</p> <p>If you use <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>, you can fill <a class="el" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d" title="Numer of pools in pPools array.">VmaDefragmentationInfo2::poolCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b" title="Either null or pointer to array of pools to be defragmented.">VmaDefragmentationInfo2::pPools</a> instead of <a class="el" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba" title="Number of allocations in pAllocations array.">VmaDefragmentationInfo2::allocationCount</a> and <a class="el" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32" title="Pointer to array of allocations that can be defragmented.">VmaDefragmentationInfo2::pAllocations</a> to defragment all allocations in given pools. You cannot use <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc" title="Optional, output. Pointer to array that will be filled with information whether the allocation at cer...">VmaDefragmentationInfo2::pAllocationsChanged</a> in that case. You can also combine both methods.</p> <h1><a class="anchor" id="defragmentation_gpu"></a> @@ -181,15 +194,18 @@ <div class="line"> <span class="comment">// Create new buffer with same parameters.</span></div> <div class="line"> VkBufferCreateInfo bufferInfo = ...;</div> <div class="line"> vkCreateBuffer(device, &bufferInfo, <span class="keyword">nullptr</span>, &buffers[i]);</div> -<div class="line"> </div> +<div class="line"> </div> <div class="line"> <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div> -<div class="line"> </div> +<div class="line"> </div> <div class="line"> <span class="comment">// Bind new buffer to new memory region. Data contained in it is already moved.</span></div> <div class="line"> <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div> <div class="line"> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &allocInfo);</div> <div class="line"> <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(allocator, allocations[i], buffers[i]);</div> <div class="line"> }</div> <div class="line">}</div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3705</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3700</div></div> +<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3714</div></div> </div><!-- fragment --><p>You can combine these two methods by specifying non-zero <code>maxGpu*</code> as well as <code>maxCpu*</code> parameters. The library automatically chooses best method to defragment each memory pool.</p> <p>You may try not to block your entire program to wait until defragmentation finishes, but do it in the background, as long as you carefully fullfill requirements described in function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>.</p> <h1><a class="anchor" id="defragmentation_additional_notes"></a> @@ -202,7 +218,7 @@ <p>Defragmentation of images created with <code>VK_IMAGE_TILING_OPTIMAL</code> or in any other layout may give undefined results.</p> <p>If you defragment allocations bound to images, new images to be bound to new memory region after defragmentation should be created with <code>VK_IMAGE_LAYOUT_PREINITIALIZED</code> and then transitioned to their original layout from before defragmentation if needed using an image memory barrier.</p> <p>While using defragmentation, you may experience validation layer warnings, which you just need to ignore. See <a class="el" href="general_considerations.html#general_considerations_validation_layer_warnings">Validation layer warnings</a>.</p> -<p>Please don't expect memory to be fully compacted after defragmentation. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximimze continuous empty space inside remaining blocks, while minimizing the number and size of allocations that need to be moved. Some fragmentation may still remain - this is normal.</p> +<p>Please don't expect memory to be fully compacted after defragmentation. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximize continuous empty space inside remaining blocks, while minimizing the number and size of allocations that need to be moved. Some fragmentation may still remain - this is normal.</p> <h1><a class="anchor" id="defragmentation_custom_algorithm"></a> Writing custom defragmentation algorithm</h1> <p>If you want to implement your own, custom defragmentation algorithm, there is infrastructure prepared for that, but it is not exposed through the library API - you need to hack its source code. Here are steps needed to do this:</p> @@ -214,25 +230,9 @@ </ol> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a3cf86ab32c1da779b4923d301a3056ba"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3585</div></div> -<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process.</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3634</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a7f71f39590c5316771493d2333f9c1bd"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">VmaDefragmentationInfo2::commandBuffer</a></div><div class="ttdeci">VkCommandBuffer commandBuffer</div><div class="ttdoc">Optional. Command buffer where GPU copy commands will be posted.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3648</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3579</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation.</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_ab6d288f29d028156cf73542d630a2e32"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">const VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3594</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3639</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3624</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process.</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3600</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3173</div></div> -<div class="ttc" id="astruct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process.</div></div> -<div class="ttc" id="astruct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side,...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3629</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/deprecated.html b/docs/html/deprecated.html index 0bf54e0..033bb68 100644 --- a/docs/html/deprecated.html +++ b/docs/html/deprecated.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Deprecated List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -66,18 +66,16 @@ </div><!--header--> <div class="contents"> <div class="textblock"><dl class="reflist"> -<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a> (<a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> allocation, VkDeviceSize newSize)</dt> -<dd><a class="anchor" id="_deprecated000001"></a> In version 2.2.0 it used to try to change allocation's size without moving or reallocating it. In current version it returns <code>VK_SUCCESS</code> only if <code>newSize</code> equals current allocation's size. Otherwise returns <code>VK_ERROR_OUT_OF_POOL_MEMORY</code>, indicating that allocation's size could not be changed. </dd> -<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a> </dt> -<dd><a class="anchor" id="_deprecated000002"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd> <dt>Member <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a> (<a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const <a class="el" href="struct_vma_defragmentation_info.html" title="Deprecated. Optional configuration parameters to be passed to function vmaDefragment().">VmaDefragmentationInfo</a> *pDefragmentationInfo, <a class="el" href="struct_vma_defragmentation_stats.html" title="Statistics returned by function vmaDefragment().">VmaDefragmentationStats</a> *pDefragmentationStats)</dt> -<dd><a class="anchor" id="_deprecated000003"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd> +<dd><a class="anchor" id="_deprecated000002"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd> +<dt>Member <a class="el" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a> </dt> +<dd><a class="anchor" id="_deprecated000001"></a>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd> </dl> </div></div><!-- contents --> </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000..32f53c1 --- /dev/null +++ b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html
@@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> +<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta name="generator" content="Doxygen 1.9.1"/> +<meta name="viewport" content="width=device-width, initial-scale=1"/> +<title>Vulkan Memory Allocator: include Directory Reference</title> +<link href="tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="jquery.js"></script> +<script type="text/javascript" src="dynsections.js"></script> +<link href="search/search.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="search/searchdata.js"></script> +<script type="text/javascript" src="search/search.js"></script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">Vulkan Memory Allocator + </div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.9.1 --> +<script type="text/javascript"> +/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); +/* @license-end */ +</script> +<script type="text/javascript" src="menudata.js"></script> +<script type="text/javascript" src="menu.js"></script> +<script type="text/javascript"> +/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ +$(function() { + initMenu('',true,false,'search.php','Search'); + $(document).ready(function() { init_search(); }); +}); +/* @license-end */</script> +<div id="main-nav"></div> +<!-- window showing the filter options --> +<div id="MSearchSelectWindow" + onmouseover="return searchBox.OnSearchSelectShow()" + onmouseout="return searchBox.OnSearchSelectHide()" + onkeydown="return searchBox.OnSearchSelectKey(event)"> +</div> + +<!-- iframe showing the search results (closed by default) --> +<div id="MSearchResultsWindow"> +<iframe src="javascript:void(0)" frameborder="0" + name="MSearchResults" id="MSearchResults"> +</iframe> +</div> + +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li> </ul> +</div> +</div><!-- top --> +<div class="header"> + <div class="headertitle"> +<div class="title">include Directory Reference</div> </div> +</div><!--header--> +<div class="contents"> +<table class="memberdecls"> +<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a> +Files</h2></td></tr> +<tr class="memitem:vk__mem__alloc_8h"><td class="memItemLeft" align="right" valign="top">file  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a> <a href="vk__mem__alloc_8h_source.html">[code]</a></td></tr> +<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr> +</table> +</div><!-- contents --> +<!-- start footer part --> +<hr class="footer"/><address class="footer"><small> +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 +</small></address> +</body> +</html>
diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css index f640966..ffbff02 100644 --- a/docs/html/doxygen.css +++ b/docs/html/doxygen.css
@@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.20 */ +/* The standard CSS for doxygen 1.9.1 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -103,30 +103,96 @@ } span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; + font-size: 70%; text-align: center; } -div.qindex, div.navpath { - width: 100%; - line-height: 140%; +h3.version { + font-size: 90%; + text-align: center; } div.navtab { - margin-right: 15px; + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; } +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + /* @group Link Styling */ a { @@ -143,17 +209,6 @@ text-decoration: underline; } -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #FFFFFF; - border: 1px double #869DCA; -} - .contents a.qindexHL:visited { color: #FFFFFF; } @@ -1426,6 +1481,12 @@ margin-left: 45px; } +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + .PageDocRTL-title div.toc li.level1 { margin-left: 0 !important; margin-right: 0;
diff --git a/docs/html/enabling_buffer_device_address.html b/docs/html/enabling_buffer_device_address.html index 1619eb6..d02eb88 100644 --- a/docs/html/enabling_buffer_device_address.html +++ b/docs/html/enabling_buffer_device_address.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Enabling buffer device address</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -90,7 +90,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/files.html b/docs/html/files.html index 3ad6e89..2037f34 100644 --- a/docs/html/files.html +++ b/docs/html/files.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -66,14 +66,15 @@ </div><!--header--> <div class="contents"> <div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory"> -<table class="directory"> -<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a href="vk__mem__alloc_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vk__mem__alloc_8h.html" target="_self">vk_mem_alloc.h</a></td><td class="desc"></td></tr> +<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory"> +<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">▼</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')"> </span><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html" target="_self">include</a></td><td class="desc"></td></tr> +<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;"> </span><a href="vk__mem__alloc_8h_source.html"><span class="icondoc"></span></a><a class="el" href="vk__mem__alloc_8h.html" target="_self">vk_mem_alloc.h</a></td><td class="desc"></td></tr> </table> </div><!-- directory --> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/functions.html b/docs/html/functions.html index d4499bb..40453da 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Class Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -195,6 +195,9 @@ <li>memoryTypeIndex : <a class="el" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo</a> </li> +<li>minAllocationAlignment +: <a class="el" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">VmaPoolCreateInfo</a> +</li> <li>minBlockCount : <a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo</a> </li> @@ -244,6 +247,9 @@ <li>pMappedData : <a class="el" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo</a> </li> +<li>pMemoryAllocateNext +: <a class="el" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">VmaPoolCreateInfo</a> +</li> <li>pMoves : <a class="el" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">VmaDefragmentationPassInfo</a> </li> @@ -265,6 +271,10 @@ <li>preferredLargeHeapBlockSize : <a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo</a> </li> +<li>priority +: <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">VmaAllocationCreateInfo</a> +, <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">VmaPoolCreateInfo</a> +</li> <li>pUserData : <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo</a> , <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo</a> @@ -388,7 +398,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index bd2646e..36607ac 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Class Members - Variables</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -195,6 +195,9 @@ <li>memoryTypeIndex : <a class="el" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo</a> </li> +<li>minAllocationAlignment +: <a class="el" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">VmaPoolCreateInfo</a> +</li> <li>minBlockCount : <a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo</a> </li> @@ -244,6 +247,9 @@ <li>pMappedData : <a class="el" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo</a> </li> +<li>pMemoryAllocateNext +: <a class="el" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">VmaPoolCreateInfo</a> +</li> <li>pMoves : <a class="el" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">VmaDefragmentationPassInfo</a> </li> @@ -265,6 +271,10 @@ <li>preferredLargeHeapBlockSize : <a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo</a> </li> +<li>priority +: <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">VmaAllocationCreateInfo</a> +, <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">VmaPoolCreateInfo</a> +</li> <li>pUserData : <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo</a> , <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo</a> @@ -388,7 +398,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/general_considerations.html b/docs/html/general_considerations.html index f9e8e44..eba9e82 100644 --- a/docs/html/general_considerations.html +++ b/docs/html/general_considerations.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: General considerations</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -90,7 +90,7 @@ </ul> </li> <li><em>Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug.</em><ul> -<li>It happens when you use lost allocations, and a new image or buffer is created in place of an existing object that bacame lost.</li> +<li>It happens when you use lost allocations, and a new image or buffer is created in place of an existing object that became lost.</li> <li>It may happen also when you use <a class="el" href="defragmentation.html">defragmentation</a>.</li> </ul> </li> @@ -111,8 +111,9 @@ Features not supported</h1> <p>Features deliberately excluded from the scope of this library:</p> <ul> -<li>Data transfer. Uploading (straming) and downloading data of buffers and images between CPU and GPU memory and related synchronization is responsibility of the user. Defining some "texture" object that would automatically stream its data from a staging copy in CPU memory to GPU memory would rather be a feature of another, higher-level library implemented on top of VMA.</li> +<li>Data transfer. Uploading (streaming) and downloading data of buffers and images between CPU and GPU memory and related synchronization is responsibility of the user. Defining some "texture" object that would automatically stream its data from a staging copy in CPU memory to GPU memory would rather be a feature of another, higher-level library implemented on top of VMA.</li> <li>Allocations for imported/exported external memory. They tend to require explicit memory type index and dedicated allocation anyway, so they don't interact with main features of this library. Such special purpose allocations should be made manually, using <code>vkCreateBuffer()</code> and <code>vkAllocateMemory()</code>.</li> +<li>Sub-allocation of parts of one large buffer. Although recommended as a good practice, it is the user's responsibility to implement such logic on top of VMA.</li> <li>Recreation of buffers and images. Although the library has functions for buffer and image creation (<a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>), you need to recreate these objects yourself after defragmentation. That's because the big structures <code>VkBufferCreateInfo</code>, <code>VkImageCreateInfo</code> are not stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a> object.</li> <li>Handling CPU memory allocation failures. When dynamically creating small C++ objects in CPU memory (not Vulkan memory), allocation failures are not checked and handled gracefully, because that would complicate code significantly and is usually not needed in desktop PC applications anyway. Success of an allocation is just checked with an assert.</li> <li>Code free of any compiler warnings. Maintaining the library to compile and work correctly on so many different platforms is hard enough. Being free of any warnings, on any version of any compiler, is simply not feasible.</li> @@ -122,7 +123,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals.html b/docs/html/globals.html index c9862fe..fb5edae 100644 --- a/docs/html/globals.html +++ b/docs/html/globals.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -134,6 +134,9 @@ <li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a> </li> +<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT +: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">vk_mem_alloc.h</a> +</li> <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a> </li> @@ -164,6 +167,9 @@ <li>VMA_MEMORY_BUDGET : <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">vk_mem_alloc.h</a> </li> +<li>VMA_MEMORY_PRIORITY +: <a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">vk_mem_alloc.h</a> +</li> <li>VMA_MEMORY_USAGE_CPU_COPY : <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">vk_mem_alloc.h</a> </li> @@ -431,9 +437,6 @@ <li>VmaRecordSettings : <a class="el" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">vk_mem_alloc.h</a> </li> -<li>vmaResizeAllocation() -: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a> -</li> <li>vmaSetAllocationUserData() : <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a> </li> @@ -462,7 +465,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html index 432c2da..26dd4e0 100644 --- a/docs/html/globals_defs.html +++ b/docs/html/globals_defs.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,6 +74,9 @@ <li>VMA_MEMORY_BUDGET : <a class="el" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a">vk_mem_alloc.h</a> </li> +<li>VMA_MEMORY_PRIORITY +: <a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">vk_mem_alloc.h</a> +</li> <li>VMA_RECORDING_ENABLED : <a class="el" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">vk_mem_alloc.h</a> </li> @@ -87,7 +90,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html index bc7c873..1d58808 100644 --- a/docs/html/globals_enum.html +++ b/docs/html/globals_enum.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -84,7 +84,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html index d4f31a2..b370fa0 100644 --- a/docs/html/globals_eval.html +++ b/docs/html/globals_eval.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -124,6 +124,9 @@ <li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">vk_mem_alloc.h</a> </li> +<li>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT +: <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">vk_mem_alloc.h</a> +</li> <li>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">vk_mem_alloc.h</a> </li> @@ -191,7 +194,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html index 1883adf..533bb8d 100644 --- a/docs/html/globals_func.html +++ b/docs/html/globals_func.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -202,9 +202,6 @@ <li>vmaMapMemory() : <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vk_mem_alloc.h</a> </li> -<li>vmaResizeAllocation() -: <a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vk_mem_alloc.h</a> -</li> <li>vmaSetAllocationUserData() : <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a> </li> @@ -224,7 +221,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/globals_type.html b/docs/html/globals_type.html index 13b8c6c..b54a1cf 100644 --- a/docs/html/globals_type.html +++ b/docs/html/globals_type.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: File Members</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -156,7 +156,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/index.html b/docs/html/index.html index bff17fc..0521098 100644 --- a/docs/html/index.html +++ b/docs/html/index.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Vulkan Memory Allocator</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -65,8 +65,8 @@ <div class="title">Vulkan Memory Allocator </div> </div> </div><!--header--> <div class="contents"> -<div class="textblock"><p><b>Version 3.0.0-development</b> (2020-06-24)</p> -<p>Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved. <br /> +<div class="textblock"><p><b>Version 3.0.0-development</b> (2021-06-21)</p> +<p>Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved. <br /> License: MIT</p> <p>Documentation of all members: <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a></p> <h1><a class="anchor" id="main_table_of_contents"></a> @@ -173,7 +173,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/lost_allocations.html b/docs/html/lost_allocations.html index 6cc8371..57bab4b 100644 --- a/docs/html/lost_allocations.html +++ b/docs/html/lost_allocations.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Lost allocations</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -117,6 +117,16 @@ <div class="line"> </div> <div class="line"> <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufCreateInfo, &allocCreateInfo, &m_Buf, &m_Alloc, <span class="keyword">nullptr</span>);</div> <div class="line">}</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2811</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2818</div></div> </div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p> <p>You can create an allocation that is already in lost state from the beginning using function <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1" title="Creates new allocation that is in lost state from the beginning.">vmaCreateLostAllocation()</a>. It may be useful if you need a "dummy" allocation that is not null.</p> <p>You can call function <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024" title="Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...">vmaMakePoolAllocationsLost()</a> to set all eligible allocations in a specified custom pool to lost state. Allocations that have been "touched" in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame.">VmaPoolCreateInfo::frameInUseCount</a> frames back cannot become lost.</p> @@ -124,19 +134,9 @@ <p>Yes, although it has no visible effect. Calls to <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.">vmaTouchAllocation()</a> update last use frame index also for allocations that cannot become lost, but the only way to observe it is to dump internal allocator state using <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format.">vmaBuildStatsString()</a>. You can use this feature for debugging purposes to explicitly mark allocations that you use in current frame and then analyze JSON dump to see for how long each allocation stays unused. </p> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="avk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2768</div></div> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2775</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2838</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/memory_mapping.html b/docs/html/memory_mapping.html index 4582fdb..fd05a94 100644 --- a/docs/html/memory_mapping.html +++ b/docs/html/memory_mapping.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Memory mapping</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -91,6 +91,10 @@ <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &mappedData);</div> <div class="line">memcpy(mappedData, &constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div> </div><!-- fragment --><p>When mapping, you may see a warning from Vulkan validation layer similar to this one:</p> <p><em>Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.</em></p> <p>It happens because the library maps entire <code>VkDeviceMemory</code> block, where different types of images and buffers may end up together, especially on GPUs with unified memory like Intel. You can safely ignore it if you are sure you access only memory of the intended object that you wanted to map.</p> @@ -112,10 +116,17 @@ <div class="line"> </div> <div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div> <div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2881</div></div> +<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3246</div></div> +<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3290</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2731</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2798</div></div> </div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p> <ul> <li>When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2), device is discrete AMD GPU, and memory type is the special 256 MiB pool of <code>DEVICE_LOCAL + HOST_VISIBLE</code> memory (selected when you use <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>), then whenever a memory block allocated from this memory type stays mapped for the time of any call to <code>vkQueueSubmit()</code> or <code>vkQueuePresentKHR()</code>, this block is migrated by WDDM to system RAM, which degrades performance. It doesn't matter if that particular memory block is actually used by the command buffer being submitted.</li> -<li>On Mac/MoltenVK there is a known bug - <a href="https://github.com/KhronosGroup/MoltenVK/issues/175">Issue #175</a> which requires unmapping before GPU can see updated texture.</li> <li>Keeping many large memory blocks mapped may impact performance or stability of some debugging tools.</li> </ul> <h1><a class="anchor" id="memory_mapping_cache_control"></a> @@ -156,6 +167,10 @@ <div class="line"> <span class="comment">// Allocation ended up in non-mappable memory.</span></div> <div class="line"> <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div> <div class="line">}</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2897</div></div> +<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3251</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> </div><!-- fragment --><p>You can even use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p> <div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div> <div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div> @@ -183,25 +198,9 @@ <div class="line">}</div> </div><!-- fragment --> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="avk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().</div></div> -<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_CPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2688</div></div> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it.</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3212</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3178</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdeci">@ VMA_ALLOCATION_CREATE_MAPPED_BIT</div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2755</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2838</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2854</div></div> -<div class="ttc" id="astruct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:3173</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/pages.html b/docs/html/pages.html index 67f6949..6525b8f 100644 --- a/docs/html/pages.html +++ b/docs/html/pages.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Related Pages</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,7 +73,7 @@ </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/quick_start.html b/docs/html/quick_start.html index ecdde06..5ed820b 100644 --- a/docs/html/quick_start.html +++ b/docs/html/quick_start.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Quick start</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -76,13 +76,19 @@ <p>To do it properly:</p> <ol type="1"> <li>Include "vk_mem_alloc.h" file in each CPP file where you want to use the library. This includes declarations of all members of the library.</li> -<li>In exacly one CPP file define following macro before this include. It enables also internal definitions.</li> +<li>In exactly one CPP file define following macro before this include. It enables also internal definitions.</li> </ol> <div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div> <div class="line"><span class="preprocessor">#include "vk_mem_alloc.h"</span></div> </div><!-- fragment --><p>It may be a good idea to create dedicated CPP file just for this purpose.</p> <p>Note on language: This library is written in C++, but has C-compatible interface. Thus you can include and use <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a> in C or C++ code, but full implementation with <code>VMA_IMPLEMENTATION</code> macro must be compiled as C++, NOT as C.</p> <p>Please note that this library includes header <code><vulkan/vulkan.h></code>, which in turn includes <code><windows.h></code> on Windows. If you need some specific macros defined before including these headers (like <code>WIN32_LEAN_AND_MEAN</code> or <code>WINVER</code> for Windows, <code>VK_USE_PLATFORM_WIN32_KHR</code> for Vulkan), you must define them before every <code>#include</code> of this library.</p> +<p>You may need to configure the way you import Vulkan functions.</p> +<ul> +<li>By default, VMA assumes you you link statically with Vulkan API. If this is not the case, <code>#define VMA_STATIC_VULKAN_FUNCTIONS 0</code> before <code>#include</code> of the VMA implementation and use another way.</li> +<li>You can <code>#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</code> and make sure <code>vkGetInstanceProcAddr</code> and <code>vkGetDeviceProcAddr</code> globals are defined. All the remaining Vulkan functions will be fetched automatically.</li> +<li>Finally, you can provide your own pointers to all Vulkan functions needed by VMA using structure member <a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd" title="Pointers to Vulkan functions. Can be null.">VmaAllocatorCreateInfo::pVulkanFunctions</a>, if you fetched them in some custom way e.g. using some loader like <a href="https://github.com/zeux/volk">Volk</a>.</li> +</ul> <h1><a class="anchor" id="quick_start_initialization"></a> Initialization</h1> <p>At program startup:</p> @@ -91,13 +97,22 @@ <li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> structure and create <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object by calling <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a>.</li> </ol> <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div> +<div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a> = VK_API_VERSION_1_2;</div> <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div> <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div> <div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a> = instance;</div> <div class="line"> </div> <div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&allocatorInfo, &allocator);</div> -</div><!-- fragment --><h1><a class="anchor" id="quick_start_resource_allocation"></a> +<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2413</div></div> +<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2418</div></div> +<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2487</div></div> +<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2421</div></div> +<div class="ttc" id="astruct_vma_allocator_create_info_html_ae0ffc55139b54520a6bb704b29ffc285"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">VmaAllocatorCreateInfo::vulkanApiVersion</a></div><div class="ttdeci">uint32_t vulkanApiVersion</div><div class="ttdoc">Optional. The highest version of Vulkan that the application is designed to use.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2496</div></div> +<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div> +</div><!-- fragment --><p>Only members <code>physicalDevice</code>, <code>device</code>, <code>instance</code> are required. However, you should inform the library which Vulkan version do you use by setting <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> and which extensions did you enable by setting <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346" title="Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.">VmaAllocatorCreateInfo::flags</a> (like <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> for VK_KHR_buffer_device_address). Otherwise, VMA would use only features of Vulkan 1.0 core with no extensions.</p> +<h1><a class="anchor" id="quick_start_resource_allocation"></a> Resource allocation</h1> <p>When you want to create a buffer or image:</p> <ol type="1"> @@ -115,27 +130,21 @@ <div class="line">VkBuffer buffer;</div> <div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, <span class="keyword">nullptr</span>);</div> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> </div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p> <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buffer, allocation);</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(allocator);</div> +<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div> </div><!-- fragment --> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="astruct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2375</div></div> -<div class="ttc" id="astruct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized.</div></div> -<div class="ttc" id="astruct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2370</div></div> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object.</div></div> -<div class="ttc" id="astruct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2378</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object.</div></div> -<div class="ttc" id="astruct_vma_allocator_create_info_html_a70dd42e29b1df1d1b9b61532ae0b370b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">VmaAllocatorCreateInfo::instance</a></div><div class="ttdeci">VkInstance instance</div><div class="ttdoc">Handle to Vulkan instance object.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2444</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/record_and_replay.html b/docs/html/record_and_replay.html index ecfae00..972cb67 100644 --- a/docs/html/record_and_replay.html +++ b/docs/html/record_and_replay.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Record and replay</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -83,7 +83,7 @@ <div class="fragment"><div class="line"><span class="preprocessor">#define VMA_RECORDING_ENABLED 1</span></div> </div><!-- fragment --><p><b>To record sequence of calls to a file:</b> Fill in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null.">VmaAllocatorCreateInfo::pRecordSettings</a> member while creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. File is opened and written during whole lifetime of the allocator.</p> <p><b>To replay file:</b> Use VmaReplay - standalone command-line program. Precompiled binary can be found in "bin" directory. Its source can be found in "src/VmaReplay" directory. Its project is generated by Premake. Command line syntax is printed when the program is launched without parameters. Basic usage: </p><pre class="fragment">VmaReplay.exe MyRecording.csv -</pre><p><b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p> +</pre><p> <b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p> <h1><a class="anchor" id="record_and_replay_additional_considerations"></a> Additional considerations</h1> <ul> @@ -94,7 +94,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/resource_aliasing.html b/docs/html/resource_aliasing.html index 2f14602..ff6b467 100644 --- a/docs/html/resource_aliasing.html +++ b/docs/html/resource_aliasing.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Resource aliasing (overlap)</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -137,7 +137,14 @@ <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(allocator, alloc);</div> <div class="line">vkDestroyImage(allocator, img2, <span class="keyword">nullptr</span>);</div> <div class="line">vkDestroyImage(allocator, img1, <span class="keyword">nullptr</span>);</div> -</div><!-- fragment --><p>Remember that using resouces that alias in memory requires proper synchronization. You need to issue a memory barrier to make sure commands that use <code>img1</code> and <code>img2</code> don't overlap on GPU timeline. You also need to treat a resource after aliasing as uninitialized - containing garbage data. For example, if you use <code>img1</code> and then want to use <code>img2</code>, you need to issue an image memory barrier for <code>img2</code> with <code>oldLayout</code> = <code>VK_IMAGE_LAYOUT_UNDEFINED</code>.</p> +<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2879</div></div> +<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2887</div></div> +<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2721</div></div> +<div class="ttc" id="avk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation.</div></div> +</div><!-- fragment --><p>Remember that using resources that alias in memory requires proper synchronization. You need to issue a memory barrier to make sure commands that use <code>img1</code> and <code>img2</code> don't overlap on GPU timeline. You also need to treat a resource after aliasing as uninitialized - containing garbage data. For example, if you use <code>img1</code> and then want to use <code>img2</code>, you need to issue an image memory barrier for <code>img2</code> with <code>oldLayout</code> = <code>VK_IMAGE_LAYOUT_UNDEFINED</code>.</p> <p>Additional considerations:</p> <ul> <li>Vulkan also allows to interpret contents of memory between aliasing resources consistently in some cases. See chapter 11.8. "Memory Aliasing" of Vulkan specification or <code>VK_IMAGE_CREATE_ALIAS_BIT</code> flag.</li> @@ -146,16 +153,9 @@ </ul> </div></div><!-- contents --> </div><!-- PageDoc --> -<div class="ttc" id="astruct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation.</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdeci">@ VMA_MEMORY_USAGE_GPU_ONLY</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2678</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory.</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2844</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation.</div></div> -<div class="ttc" id="astruct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2836</div></div> -<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html index a34319f..1ec5b2d 100644 --- a/docs/html/search/all_0.html +++ b/docs/html/search/all_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html index 51aff6f..9f80e90 100644 --- a/docs/html/search/all_1.html +++ b/docs/html/search/all_1.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_1.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html index e6ca18b..3bf1196 100644 --- a/docs/html/search/all_10.html +++ b/docs/html/search/all_10.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_10.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js index c96bee2..850811a 100644 --- a/docs/html/search/all_10.js +++ b/docs/html/search/all_10.js
@@ -1,11 +1,11 @@ var searchData= [ - ['unusedbytes_76',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]], - ['unusedrangecount_77',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], - ['unusedrangesizeavg_78',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]], - ['unusedrangesizemax_79',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]], - ['unusedrangesizemin_80',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]], - ['unusedsize_81',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], - ['usage_82',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]], - ['usedbytes_83',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]] + ['unusedbytes_79',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]], + ['unusedrangecount_80',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], + ['unusedrangesizeavg_81',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]], + ['unusedrangesizemax_82',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]], + ['unusedrangesizemin_83',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]], + ['unusedsize_84',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], + ['usage_85',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]], + ['usedbytes_86',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]] ];
diff --git a/docs/html/search/all_11.html b/docs/html/search/all_11.html index 7cf685f..c9f79d2 100644 --- a/docs/html/search/all_11.html +++ b/docs/html/search/all_11.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_11.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js index 1ca905f..bd08dee 100644 --- a/docs/html/search/all_11.js +++ b/docs/html/search/all_11.js
@@ -1,157 +1,158 @@ var searchData= [ - ['vulkan_20memory_20allocator_84',['Vulkan Memory Allocator',['../index.html',1,'']]], - ['vk_5famd_5fdevice_5fcoherent_5fmemory_85',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]], - ['vk_5fkhr_5fdedicated_5fallocation_86',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]], - ['vk_5fmem_5falloc_2eh_87',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]], - ['vkallocatememory_88',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]], - ['vkbindbuffermemory_89',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]], - ['vkbindimagememory_90',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]], - ['vkcmdcopybuffer_91',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]], - ['vkcreatebuffer_92',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]], - ['vkcreateimage_93',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]], - ['vkdestroybuffer_94',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]], - ['vkdestroyimage_95',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]], - ['vkflushmappedmemoryranges_96',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]], - ['vkfreememory_97',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]], - ['vkgetbuffermemoryrequirements_98',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]], - ['vkgetimagememoryrequirements_99',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]], - ['vkgetphysicaldevicememoryproperties_100',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]], - ['vkgetphysicaldeviceproperties_101',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]], - ['vkinvalidatemappedmemoryranges_102',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]], - ['vkmapmemory_103',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]], - ['vkunmapmemory_104',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]], - ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_105',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_106',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_107',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_108',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_109',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fmapped_5fbit_110',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_111',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_112',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_113',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmask_114',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_115',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_116',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_117',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_118',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_119',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_120',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_121',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_122',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_123',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_124',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_125',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_126',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_127',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_128',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]], - ['vma_5fbind_5fmemory2_129',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]], - ['vma_5fbuffer_5fdevice_5faddress_130',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]], - ['vma_5fdedicated_5fallocation_131',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]], - ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_132',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]], - ['vma_5fdefragmentation_5fflag_5fincremental_133',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fbudget_134',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fcopy_135',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fonly_136',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_137',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_138',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5fonly_139',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_140',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fmax_5fenum_141',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5funknown_142',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5falgorithm_5fmask_143',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_144',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_145',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_146',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_147',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]], - ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_148',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]], - ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_149',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]], - ['vma_5frecording_5fenabled_150',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]], - ['vma_5fstats_5fstring_5fenabled_151',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]], - ['vma_5fvulkan_5fversion_152',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]], - ['vmaallocatememory_153',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforbuffer_154',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforimage_155',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], - ['vmaallocatememorypages_156',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]], - ['vmaallocation_157',['VmaAllocation',['../struct_vma_allocation.html',1,'']]], - ['vmaallocationcreateflagbits_158',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h']]], - ['vmaallocationcreateflags_159',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], - ['vmaallocationcreateinfo_160',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'VmaAllocationCreateInfo(): vk_mem_alloc.h']]], - ['vmaallocationinfo_161',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'VmaAllocationInfo(): vk_mem_alloc.h']]], - ['vmaallocator_162',['VmaAllocator',['../struct_vma_allocator.html',1,'']]], - ['vmaallocatorcreateflagbits_163',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'VmaAllocatorCreateFlagBits(): vk_mem_alloc.h']]], - ['vmaallocatorcreateflags_164',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]], - ['vmaallocatorcreateinfo_165',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'VmaAllocatorCreateInfo(): vk_mem_alloc.h']]], - ['vmaallocatorinfo_166',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'VmaAllocatorInfo'],['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'VmaAllocatorInfo(): vk_mem_alloc.h']]], - ['vmabegindefragmentationpass_167',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]], - ['vmabindbuffermemory_168',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]], - ['vmabindbuffermemory2_169',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]], - ['vmabindimagememory_170',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]], - ['vmabindimagememory2_171',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]], - ['vmabudget_172',['VmaBudget',['../struct_vma_budget.html',1,'VmaBudget'],['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'VmaBudget(): vk_mem_alloc.h']]], - ['vmabuildstatsstring_173',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], - ['vmacalculatestats_174',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], - ['vmacheckcorruption_175',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]], - ['vmacheckpoolcorruption_176',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]], - ['vmacreateallocator_177',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], - ['vmacreatebuffer_178',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], - ['vmacreateimage_179',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], - ['vmacreatelostallocation_180',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], - ['vmacreatepool_181',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], - ['vmadefragment_182',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]], - ['vmadefragmentationbegin_183',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]], - ['vmadefragmentationcontext_184',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]], - ['vmadefragmentationend_185',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]], - ['vmadefragmentationflagbits_186',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'VmaDefragmentationFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'VmaDefragmentationFlagBits(): vk_mem_alloc.h']]], - ['vmadefragmentationflags_187',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]], - ['vmadefragmentationinfo_188',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'VmaDefragmentationInfo(): vk_mem_alloc.h']]], - ['vmadefragmentationinfo2_189',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'VmaDefragmentationInfo2(): vk_mem_alloc.h']]], - ['vmadefragmentationpassinfo_190',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'VmaDefragmentationPassInfo'],['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'VmaDefragmentationPassInfo(): vk_mem_alloc.h']]], - ['vmadefragmentationpassmoveinfo_191',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'VmaDefragmentationPassMoveInfo'],['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'VmaDefragmentationPassMoveInfo(): vk_mem_alloc.h']]], - ['vmadefragmentationstats_192',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'VmaDefragmentationStats(): vk_mem_alloc.h']]], - ['vmadestroyallocator_193',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], - ['vmadestroybuffer_194',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], - ['vmadestroyimage_195',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], - ['vmadestroypool_196',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], - ['vmadevicememorycallbacks_197',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'VmaDeviceMemoryCallbacks(): vk_mem_alloc.h']]], - ['vmaenddefragmentationpass_198',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindex_199',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindexforbufferinfo_200',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindexforimageinfo_201',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]], - ['vmaflushallocation_202',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]], - ['vmaflushallocations_203',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]], - ['vmafreememory_204',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]], - ['vmafreememorypages_205',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]], - ['vmafreestatsstring_206',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], - ['vmagetallocationinfo_207',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], - ['vmagetallocatorinfo_208',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]], - ['vmagetbudget_209',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]], - ['vmagetmemoryproperties_210',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], - ['vmagetmemorytypeproperties_211',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], - ['vmagetphysicaldeviceproperties_212',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], - ['vmagetpoolname_213',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]], - ['vmagetpoolstats_214',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], - ['vmainvalidateallocation_215',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]], - ['vmainvalidateallocations_216',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]], - ['vmamakepoolallocationslost_217',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], - ['vmamapmemory_218',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], - ['vmamemoryusage_219',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'VmaMemoryUsage(): vk_mem_alloc.h']]], - ['vmapool_220',['VmaPool',['../struct_vma_pool.html',1,'']]], - ['vmapoolcreateflagbits_221',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h']]], - ['vmapoolcreateflags_222',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], - ['vmapoolcreateinfo_223',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'VmaPoolCreateInfo(): vk_mem_alloc.h']]], - ['vmapoolstats_224',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'VmaPoolStats(): vk_mem_alloc.h']]], - ['vmarecordflagbits_225',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'VmaRecordFlagBits(): vk_mem_alloc.h']]], - ['vmarecordflags_226',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]], - ['vmarecordsettings_227',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'VmaRecordSettings(): vk_mem_alloc.h']]], - ['vmaresizeallocation_228',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]], - ['vmasetallocationuserdata_229',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], - ['vmasetcurrentframeindex_230',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], - ['vmasetpoolname_231',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]], - ['vmastatinfo_232',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'VmaStatInfo(): vk_mem_alloc.h']]], - ['vmastats_233',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'VmaStats(): vk_mem_alloc.h']]], - ['vmatouchallocation_234',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]], - ['vmaunmapmemory_235',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]], - ['vmavulkanfunctions_236',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'VmaVulkanFunctions(): vk_mem_alloc.h']]], - ['vulkanapiversion_237',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]] + ['vk_5famd_5fdevice_5fcoherent_5fmemory_87',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]], + ['vk_5fkhr_5fdedicated_5fallocation_88',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]], + ['vk_5fmem_5falloc_2eh_89',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]], + ['vkallocatememory_90',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]], + ['vkbindbuffermemory_91',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]], + ['vkbindimagememory_92',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]], + ['vkcmdcopybuffer_93',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]], + ['vkcreatebuffer_94',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]], + ['vkcreateimage_95',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]], + ['vkdestroybuffer_96',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]], + ['vkdestroyimage_97',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]], + ['vkflushmappedmemoryranges_98',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]], + ['vkfreememory_99',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]], + ['vkgetbuffermemoryrequirements_100',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]], + ['vkgetimagememoryrequirements_101',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]], + ['vkgetphysicaldevicememoryproperties_102',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]], + ['vkgetphysicaldeviceproperties_103',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]], + ['vkinvalidatemappedmemoryranges_104',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]], + ['vkmapmemory_105',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]], + ['vkunmapmemory_106',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]], + ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_107',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_108',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_109',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_110',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_111',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fmapped_5fbit_112',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_113',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_114',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_115',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmask_116',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_117',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_118',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_119',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_120',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_121',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_122',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_123',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_124',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_125',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_126',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fext_5fmemory_5fpriority_5fbit_127',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_128',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_129',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_130',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_131',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]], + ['vma_5fbind_5fmemory2_132',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]], + ['vma_5fbuffer_5fdevice_5faddress_133',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]], + ['vma_5fdedicated_5fallocation_134',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]], + ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_135',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]], + ['vma_5fdefragmentation_5fflag_5fincremental_136',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fbudget_137',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fpriority_138',['VMA_MEMORY_PRIORITY',['../vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fcopy_139',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fonly_140',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_141',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_142',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5fonly_143',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_144',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fmax_5fenum_145',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5funknown_146',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5falgorithm_5fmask_147',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_148',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_149',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_150',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_151',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]], + ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_152',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]], + ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_153',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]], + ['vma_5frecording_5fenabled_154',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]], + ['vma_5fstats_5fstring_5fenabled_155',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]], + ['vma_5fvulkan_5fversion_156',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]], + ['vmaallocatememory_157',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforbuffer_158',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforimage_159',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], + ['vmaallocatememorypages_160',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]], + ['vmaallocation_161',['VmaAllocation',['../struct_vma_allocation.html',1,'']]], + ['vmaallocationcreateflagbits_162',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h']]], + ['vmaallocationcreateflags_163',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateinfo_164',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'VmaAllocationCreateInfo(): vk_mem_alloc.h']]], + ['vmaallocationinfo_165',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'VmaAllocationInfo(): vk_mem_alloc.h']]], + ['vmaallocator_166',['VmaAllocator',['../struct_vma_allocator.html',1,'']]], + ['vmaallocatorcreateflagbits_167',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'VmaAllocatorCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits(): vk_mem_alloc.h']]], + ['vmaallocatorcreateflags_168',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]], + ['vmaallocatorcreateinfo_169',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'VmaAllocatorCreateInfo(): vk_mem_alloc.h']]], + ['vmaallocatorinfo_170',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'VmaAllocatorInfo'],['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'VmaAllocatorInfo(): vk_mem_alloc.h']]], + ['vmabegindefragmentationpass_171',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]], + ['vmabindbuffermemory_172',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]], + ['vmabindbuffermemory2_173',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]], + ['vmabindimagememory_174',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]], + ['vmabindimagememory2_175',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]], + ['vmabudget_176',['VmaBudget',['../struct_vma_budget.html',1,'VmaBudget'],['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'VmaBudget(): vk_mem_alloc.h']]], + ['vmabuildstatsstring_177',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], + ['vmacalculatestats_178',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], + ['vmacheckcorruption_179',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]], + ['vmacheckpoolcorruption_180',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]], + ['vmacreateallocator_181',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], + ['vmacreatebuffer_182',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], + ['vmacreateimage_183',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], + ['vmacreatelostallocation_184',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], + ['vmacreatepool_185',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], + ['vmadefragment_186',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]], + ['vmadefragmentationbegin_187',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]], + ['vmadefragmentationcontext_188',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]], + ['vmadefragmentationend_189',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]], + ['vmadefragmentationflagbits_190',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'VmaDefragmentationFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'VmaDefragmentationFlagBits(): vk_mem_alloc.h']]], + ['vmadefragmentationflags_191',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]], + ['vmadefragmentationinfo_192',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'VmaDefragmentationInfo(): vk_mem_alloc.h']]], + ['vmadefragmentationinfo2_193',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'VmaDefragmentationInfo2(): vk_mem_alloc.h']]], + ['vmadefragmentationpassinfo_194',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'VmaDefragmentationPassInfo'],['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'VmaDefragmentationPassInfo(): vk_mem_alloc.h']]], + ['vmadefragmentationpassmoveinfo_195',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'VmaDefragmentationPassMoveInfo'],['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'VmaDefragmentationPassMoveInfo(): vk_mem_alloc.h']]], + ['vmadefragmentationstats_196',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'VmaDefragmentationStats(): vk_mem_alloc.h']]], + ['vmadestroyallocator_197',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], + ['vmadestroybuffer_198',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], + ['vmadestroyimage_199',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], + ['vmadestroypool_200',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], + ['vmadevicememorycallbacks_201',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'VmaDeviceMemoryCallbacks(): vk_mem_alloc.h']]], + ['vmaenddefragmentationpass_202',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindex_203',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindexforbufferinfo_204',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindexforimageinfo_205',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]], + ['vmaflushallocation_206',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]], + ['vmaflushallocations_207',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]], + ['vmafreememory_208',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]], + ['vmafreememorypages_209',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]], + ['vmafreestatsstring_210',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], + ['vmagetallocationinfo_211',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], + ['vmagetallocatorinfo_212',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]], + ['vmagetbudget_213',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]], + ['vmagetmemoryproperties_214',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], + ['vmagetmemorytypeproperties_215',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], + ['vmagetphysicaldeviceproperties_216',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], + ['vmagetpoolname_217',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]], + ['vmagetpoolstats_218',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], + ['vmainvalidateallocation_219',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]], + ['vmainvalidateallocations_220',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]], + ['vmamakepoolallocationslost_221',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], + ['vmamapmemory_222',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], + ['vmamemoryusage_223',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'VmaMemoryUsage(): vk_mem_alloc.h']]], + ['vmapool_224',['VmaPool',['../struct_vma_pool.html',1,'']]], + ['vmapoolcreateflagbits_225',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h']]], + ['vmapoolcreateflags_226',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], + ['vmapoolcreateinfo_227',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'VmaPoolCreateInfo(): vk_mem_alloc.h'],['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo']]], + ['vmapoolstats_228',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'VmaPoolStats(): vk_mem_alloc.h']]], + ['vmarecordflagbits_229',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits(): vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'VmaRecordFlagBits(): vk_mem_alloc.h']]], + ['vmarecordflags_230',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]], + ['vmarecordsettings_231',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'VmaRecordSettings(): vk_mem_alloc.h']]], + ['vmasetallocationuserdata_232',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], + ['vmasetcurrentframeindex_233',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], + ['vmasetpoolname_234',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]], + ['vmastatinfo_235',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'VmaStatInfo(): vk_mem_alloc.h']]], + ['vmastats_236',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'VmaStats(): vk_mem_alloc.h']]], + ['vmatouchallocation_237',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]], + ['vmaunmapmemory_238',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]], + ['vmavulkanfunctions_239',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'VmaVulkanFunctions(): vk_mem_alloc.h'],['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions']]], + ['vulkan_20memory_20allocator_240',['Vulkan Memory Allocator',['../index.html',1,'']]], + ['vulkanapiversion_241',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]] ];
diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html index 1f81f66..02cfffc 100644 --- a/docs/html/search/all_2.html +++ b/docs/html/search/all_2.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_2.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html index 2e31ab9..39767b8 100644 --- a/docs/html/search/all_3.html +++ b/docs/html/search/all_3.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_3.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html index 0540c16..fc40463 100644 --- a/docs/html/search/all_4.html +++ b/docs/html/search/all_4.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_4.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html index ebec30b..9dd9344 100644 --- a/docs/html/search/all_5.html +++ b/docs/html/search/all_5.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_5.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html index 31cbd05..f1e516d 100644 --- a/docs/html/search/all_6.html +++ b/docs/html/search/all_6.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_6.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html index 18c555d..8ddbf6c 100644 --- a/docs/html/search/all_7.html +++ b/docs/html/search/all_7.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_7.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html index 0f9eb41..83c55ae 100644 --- a/docs/html/search/all_8.html +++ b/docs/html/search/all_8.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_8.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html index d27c0f7..1e263c1 100644 --- a/docs/html/search/all_9.html +++ b/docs/html/search/all_9.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_9.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js index d88c966..a976c0a 100644 --- a/docs/html/search/all_9.js +++ b/docs/html/search/all_9.js
@@ -13,6 +13,7 @@ ['memorytype_40',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], ['memorytypebits_41',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]], ['memorytypeindex_42',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], - ['minblockcount_43',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]], - ['movecount_44',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]] + ['minallocationalignment_43',['minAllocationAlignment',['../struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb',1,'VmaPoolCreateInfo']]], + ['minblockcount_44',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]], + ['movecount_45',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]] ];
diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html index 2c8b75b..3a6cac1 100644 --- a/docs/html/search/all_a.html +++ b/docs/html/search/all_a.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_a.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js index 4612195..25ff2bb 100644 --- a/docs/html/search/all_a.js +++ b/docs/html/search/all_a.js
@@ -1,4 +1,4 @@ var searchData= [ - ['offset_45',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]] + ['offset_46',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]] ];
diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html index 9a220b1..130deb4 100644 --- a/docs/html/search/all_b.html +++ b/docs/html/search/all_b.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_b.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js index db99386..042505b 100644 --- a/docs/html/search/all_b.js +++ b/docs/html/search/all_b.js
@@ -1,24 +1,26 @@ var searchData= [ - ['pallocationcallbacks_46',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]], - ['pallocations_47',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]], - ['pallocationschanged_48',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]], - ['pdevicememorycallbacks_49',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]], - ['pfilepath_50',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]], - ['pfn_5fvmaallocatedevicememoryfunction_51',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]], - ['pfn_5fvmafreedevicememoryfunction_52',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]], - ['pfnallocate_53',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]], - ['pfnfree_54',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], - ['pheapsizelimit_55',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]], - ['physicaldevice_56',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]], - ['pmappeddata_57',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], - ['pmoves_58',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]], - ['pool_59',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], - ['poolcount_60',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]], - ['ppools_61',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]], - ['precordsettings_62',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]], - ['preferredflags_63',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], - ['preferredlargeheapblocksize_64',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], - ['puserdata_65',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]], - ['pvulkanfunctions_66',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]] + ['pallocationcallbacks_47',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]], + ['pallocations_48',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]], + ['pallocationschanged_49',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]], + ['pdevicememorycallbacks_50',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]], + ['pfilepath_51',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]], + ['pfn_5fvmaallocatedevicememoryfunction_52',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]], + ['pfn_5fvmafreedevicememoryfunction_53',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]], + ['pfnallocate_54',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]], + ['pfnfree_55',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], + ['pheapsizelimit_56',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]], + ['physicaldevice_57',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]], + ['pmappeddata_58',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], + ['pmemoryallocatenext_59',['pMemoryAllocateNext',['../struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7',1,'VmaPoolCreateInfo']]], + ['pmoves_60',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]], + ['pool_61',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], + ['poolcount_62',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]], + ['ppools_63',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]], + ['precordsettings_64',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]], + ['preferredflags_65',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], + ['preferredlargeheapblocksize_66',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], + ['priority_67',['priority',['../struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7',1,'VmaAllocationCreateInfo::priority()'],['../struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274',1,'VmaPoolCreateInfo::priority()']]], + ['puserdata_68',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]], + ['pvulkanfunctions_69',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]] ];
diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html index ec92b71..3dd5af0 100644 --- a/docs/html/search/all_c.html +++ b/docs/html/search/all_c.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_c.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index c9ce84c..b75d685 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js
@@ -1,4 +1,4 @@ var searchData= [ - ['quick_20start_67',['Quick start',['../quick_start.html',1,'index']]] + ['quick_20start_70',['Quick start',['../quick_start.html',1,'index']]] ];
diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html index 606caba..af7f2f0 100644 --- a/docs/html/search/all_d.html +++ b/docs/html/search/all_d.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_d.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js index a77058c..4b4e4ca 100644 --- a/docs/html/search/all_d.js +++ b/docs/html/search/all_d.js
@@ -1,7 +1,7 @@ var searchData= [ - ['record_20and_20replay_68',['Record and replay',['../record_and_replay.html',1,'index']]], - ['requiredflags_69',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]], - ['resource_20aliasing_20_28overlap_29_70',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]], - ['recommended_20usage_20patterns_71',['Recommended usage patterns',['../usage_patterns.html',1,'index']]] + ['recommended_20usage_20patterns_71',['Recommended usage patterns',['../usage_patterns.html',1,'index']]], + ['record_20and_20replay_72',['Record and replay',['../record_and_replay.html',1,'index']]], + ['requiredflags_73',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]], + ['resource_20aliasing_20_28overlap_29_74',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]] ];
diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html index 310da24..e25df42 100644 --- a/docs/html/search/all_e.html +++ b/docs/html/search/all_e.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_e.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js index 20d416e..e2ec19a 100644 --- a/docs/html/search/all_e.js +++ b/docs/html/search/all_e.js
@@ -1,6 +1,6 @@ var searchData= [ - ['size_72',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]], - ['statistics_73',['Statistics',['../statistics.html',1,'index']]], - ['staying_20within_20budget_74',['Staying within budget',['../staying_within_budget.html',1,'index']]] + ['size_75',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]], + ['statistics_76',['Statistics',['../statistics.html',1,'index']]], + ['staying_20within_20budget_77',['Staying within budget',['../staying_within_budget.html',1,'index']]] ];
diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html index de78f81..b23da6c 100644 --- a/docs/html/search/all_f.html +++ b/docs/html/search/all_f.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="all_f.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js index 628d913..4057a78 100644 --- a/docs/html/search/all_f.js +++ b/docs/html/search/all_f.js
@@ -1,4 +1,4 @@ var searchData= [ - ['total_75',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]] + ['total_78',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]] ];
diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html index 7e0afc8..af8159e 100644 --- a/docs/html/search/classes_0.html +++ b/docs/html/search/classes_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="classes_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js index 71d8cb1..80a151e 100644 --- a/docs/html/search/classes_0.js +++ b/docs/html/search/classes_0.js
@@ -1,24 +1,24 @@ var searchData= [ - ['vmaallocation_238',['VmaAllocation',['../struct_vma_allocation.html',1,'']]], - ['vmaallocationcreateinfo_239',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]], - ['vmaallocationinfo_240',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]], - ['vmaallocator_241',['VmaAllocator',['../struct_vma_allocator.html',1,'']]], - ['vmaallocatorcreateinfo_242',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]], - ['vmaallocatorinfo_243',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'']]], - ['vmabudget_244',['VmaBudget',['../struct_vma_budget.html',1,'']]], - ['vmadefragmentationcontext_245',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]], - ['vmadefragmentationinfo_246',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]], - ['vmadefragmentationinfo2_247',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]], - ['vmadefragmentationpassinfo_248',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'']]], - ['vmadefragmentationpassmoveinfo_249',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'']]], - ['vmadefragmentationstats_250',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]], - ['vmadevicememorycallbacks_251',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]], - ['vmapool_252',['VmaPool',['../struct_vma_pool.html',1,'']]], - ['vmapoolcreateinfo_253',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]], - ['vmapoolstats_254',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]], - ['vmarecordsettings_255',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]], - ['vmastatinfo_256',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]], - ['vmastats_257',['VmaStats',['../struct_vma_stats.html',1,'']]], - ['vmavulkanfunctions_258',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]] + ['vmaallocation_242',['VmaAllocation',['../struct_vma_allocation.html',1,'']]], + ['vmaallocationcreateinfo_243',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]], + ['vmaallocationinfo_244',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]], + ['vmaallocator_245',['VmaAllocator',['../struct_vma_allocator.html',1,'']]], + ['vmaallocatorcreateinfo_246',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]], + ['vmaallocatorinfo_247',['VmaAllocatorInfo',['../struct_vma_allocator_info.html',1,'']]], + ['vmabudget_248',['VmaBudget',['../struct_vma_budget.html',1,'']]], + ['vmadefragmentationcontext_249',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]], + ['vmadefragmentationinfo_250',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]], + ['vmadefragmentationinfo2_251',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'']]], + ['vmadefragmentationpassinfo_252',['VmaDefragmentationPassInfo',['../struct_vma_defragmentation_pass_info.html',1,'']]], + ['vmadefragmentationpassmoveinfo_253',['VmaDefragmentationPassMoveInfo',['../struct_vma_defragmentation_pass_move_info.html',1,'']]], + ['vmadefragmentationstats_254',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]], + ['vmadevicememorycallbacks_255',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]], + ['vmapool_256',['VmaPool',['../struct_vma_pool.html',1,'']]], + ['vmapoolcreateinfo_257',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]], + ['vmapoolstats_258',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]], + ['vmarecordsettings_259',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]], + ['vmastatinfo_260',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]], + ['vmastats_261',['VmaStats',['../struct_vma_stats.html',1,'']]], + ['vmavulkanfunctions_262',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]] ];
diff --git a/docs/html/search/defines_0.html b/docs/html/search/defines_0.html index 0ede6c4..15cc3de 100644 --- a/docs/html/search/defines_0.html +++ b/docs/html/search/defines_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="defines_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/defines_0.js b/docs/html/search/defines_0.js index 55d0767..c7cb97c 100644 --- a/docs/html/search/defines_0.js +++ b/docs/html/search/defines_0.js
@@ -1,10 +1,11 @@ var searchData= [ - ['vma_5fbind_5fmemory2_472',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]], - ['vma_5fbuffer_5fdevice_5faddress_473',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]], - ['vma_5fdedicated_5fallocation_474',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fbudget_475',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]], - ['vma_5frecording_5fenabled_476',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]], - ['vma_5fstats_5fstring_5fenabled_477',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]], - ['vma_5fvulkan_5fversion_478',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]] + ['vma_5fbind_5fmemory2_479',['VMA_BIND_MEMORY2',['../vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d',1,'vk_mem_alloc.h']]], + ['vma_5fbuffer_5fdevice_5faddress_480',['VMA_BUFFER_DEVICE_ADDRESS',['../vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10',1,'vk_mem_alloc.h']]], + ['vma_5fdedicated_5fallocation_481',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fbudget_482',['VMA_MEMORY_BUDGET',['../vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fpriority_483',['VMA_MEMORY_PRIORITY',['../vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4',1,'vk_mem_alloc.h']]], + ['vma_5frecording_5fenabled_484',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]], + ['vma_5fstats_5fstring_5fenabled_485',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]], + ['vma_5fvulkan_5fversion_486',['VMA_VULKAN_VERSION',['../vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/enums_0.html b/docs/html/search/enums_0.html index 9035e6a..141fff5 100644 --- a/docs/html/search/enums_0.html +++ b/docs/html/search/enums_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="enums_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js index a65c89d..d5dc2ac 100644 --- a/docs/html/search/enums_0.js +++ b/docs/html/search/enums_0.js
@@ -1,9 +1,9 @@ var searchData= [ - ['vmaallocationcreateflagbits_425',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]], - ['vmaallocatorcreateflagbits_426',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]], - ['vmadefragmentationflagbits_427',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]], - ['vmamemoryusage_428',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]], - ['vmapoolcreateflagbits_429',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]], - ['vmarecordflagbits_430',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]] + ['vmaallocationcreateflagbits_431',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]], + ['vmaallocatorcreateflagbits_432',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]], + ['vmadefragmentationflagbits_433',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]], + ['vmamemoryusage_434',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflagbits_435',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]], + ['vmarecordflagbits_436',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/enumvalues_0.html b/docs/html/search/enumvalues_0.html index c2cd472..0d131d9 100644 --- a/docs/html/search/enumvalues_0.html +++ b/docs/html/search/enumvalues_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="enumvalues_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js index 82bd66b..5079f5f 100644 --- a/docs/html/search/enumvalues_0.js +++ b/docs/html/search/enumvalues_0.js
@@ -1,44 +1,45 @@ var searchData= [ - ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_431',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_432',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_433',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_434',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_435',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fmapped_5fbit_436',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_437',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_438',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_439',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmask_440',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_441',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_442',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_443',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_444',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_445',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_446',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]], - ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_447',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_448',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_449',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_450',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_451',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_452',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_453',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]], - ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_454',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]], - ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_455',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]], - ['vma_5fdefragmentation_5fflag_5fincremental_456',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fcopy_457',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fonly_458',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_459',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_460',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5fonly_461',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_462',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5fmax_5fenum_463',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5funknown_464',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5falgorithm_5fmask_465',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_466',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_467',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_468',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], - ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_469',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]], - ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_470',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]], - ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_471',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]] + ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit_437',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit_438',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit_439',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fdont_5fbind_5fbit_440',['VMA_ALLOCATION_CREATE_DONT_BIND_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum_441',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fmapped_5fbit_442',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit_443',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fbest_5ffit_5fbit_444',['VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5ffirst_5ffit_5fbit_445',['VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmask_446',['VMA_ALLOCATION_CREATE_STRATEGY_MASK',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ffragmentation_5fbit_447',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5fmemory_5fbit_448',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fmin_5ftime_5fbit_449',['VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fstrategy_5fworst_5ffit_5fbit_450',['VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fupper_5faddress_5fbit_451',['VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit_452',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fwithin_5fbudget_5fbit_453',['VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5famd_5fdevice_5fcoherent_5fmemory_5fbit_454',['VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fbuffer_5fdevice_5faddress_5fbit_455',['VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fext_5fmemory_5fbudget_5fbit_456',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fext_5fmemory_5fpriority_5fbit_457',['VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit_458',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum_459',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fkhr_5fbind_5fmemory2_5fbit_460',['VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee',1,'vk_mem_alloc.h']]], + ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit_461',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]], + ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum_462',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]], + ['vma_5fdefragmentation_5fflag_5fincremental_463',['VMA_DEFRAGMENTATION_FLAG_INCREMENTAL',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fcopy_464',['VMA_MEMORY_USAGE_CPU_COPY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fonly_465',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu_466',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5flazily_5fallocated_467',['VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5fonly_468',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu_469',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5fmax_5fenum_470',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], + ['vma_5fmemory_5fusage_5funknown_471',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5falgorithm_5fmask_472',['VMA_POOL_CREATE_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fbuddy_5falgorithm_5fbit_473',['VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum_474',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit_475',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5flinear_5falgorithm_5fbit_476',['VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726',1,'vk_mem_alloc.h']]], + ['vma_5frecord_5fflag_5fbits_5fmax_5fenum_477',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]], + ['vma_5frecord_5fflush_5fafter_5fcall_5fbit_478',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/files_0.html b/docs/html/search/files_0.html index 76b64f5..9498842 100644 --- a/docs/html/search/files_0.html +++ b/docs/html/search/files_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="files_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js index 4c467ee..354b47a 100644 --- a/docs/html/search/files_0.js +++ b/docs/html/search/files_0.js
@@ -1,4 +1,4 @@ var searchData= [ - ['vk_5fmem_5falloc_2eh_259',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]] + ['vk_5fmem_5falloc_2eh_263',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]] ];
diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html index f04535a..eb4c501 100644 --- a/docs/html/search/functions_0.html +++ b/docs/html/search/functions_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="functions_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js index ed18dfa..0d82e01 100644 --- a/docs/html/search/functions_0.js +++ b/docs/html/search/functions_0.js
@@ -1,55 +1,54 @@ var searchData= [ - ['vmaallocatememory_260',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforbuffer_261',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforimage_262',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], - ['vmaallocatememorypages_263',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]], - ['vmabegindefragmentationpass_264',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]], - ['vmabindbuffermemory_265',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]], - ['vmabindbuffermemory2_266',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]], - ['vmabindimagememory_267',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]], - ['vmabindimagememory2_268',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]], - ['vmabuildstatsstring_269',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], - ['vmacalculatestats_270',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], - ['vmacheckcorruption_271',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]], - ['vmacheckpoolcorruption_272',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]], - ['vmacreateallocator_273',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], - ['vmacreatebuffer_274',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], - ['vmacreateimage_275',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], - ['vmacreatelostallocation_276',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], - ['vmacreatepool_277',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], - ['vmadefragment_278',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]], - ['vmadefragmentationbegin_279',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]], - ['vmadefragmentationend_280',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]], - ['vmadestroyallocator_281',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], - ['vmadestroybuffer_282',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], - ['vmadestroyimage_283',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], - ['vmadestroypool_284',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], - ['vmaenddefragmentationpass_285',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindex_286',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindexforbufferinfo_287',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindexforimageinfo_288',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]], - ['vmaflushallocation_289',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]], - ['vmaflushallocations_290',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]], - ['vmafreememory_291',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]], - ['vmafreememorypages_292',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]], - ['vmafreestatsstring_293',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], - ['vmagetallocationinfo_294',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], - ['vmagetallocatorinfo_295',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]], - ['vmagetbudget_296',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]], - ['vmagetmemoryproperties_297',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], - ['vmagetmemorytypeproperties_298',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], - ['vmagetphysicaldeviceproperties_299',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], - ['vmagetpoolname_300',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]], - ['vmagetpoolstats_301',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], - ['vmainvalidateallocation_302',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]], - ['vmainvalidateallocations_303',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]], - ['vmamakepoolallocationslost_304',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], - ['vmamapmemory_305',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], - ['vmaresizeallocation_306',['vmaResizeAllocation',['../vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696',1,'vk_mem_alloc.h']]], - ['vmasetallocationuserdata_307',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], - ['vmasetcurrentframeindex_308',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], - ['vmasetpoolname_309',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]], - ['vmatouchallocation_310',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]], - ['vmaunmapmemory_311',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]] + ['vmaallocatememory_264',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforbuffer_265',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforimage_266',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], + ['vmaallocatememorypages_267',['vmaAllocateMemoryPages',['../vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1',1,'vk_mem_alloc.h']]], + ['vmabegindefragmentationpass_268',['vmaBeginDefragmentationPass',['../vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b',1,'vk_mem_alloc.h']]], + ['vmabindbuffermemory_269',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]], + ['vmabindbuffermemory2_270',['vmaBindBufferMemory2',['../vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a',1,'vk_mem_alloc.h']]], + ['vmabindimagememory_271',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]], + ['vmabindimagememory2_272',['vmaBindImageMemory2',['../vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc',1,'vk_mem_alloc.h']]], + ['vmabuildstatsstring_273',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], + ['vmacalculatestats_274',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], + ['vmacheckcorruption_275',['vmaCheckCorruption',['../vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98',1,'vk_mem_alloc.h']]], + ['vmacheckpoolcorruption_276',['vmaCheckPoolCorruption',['../vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89',1,'vk_mem_alloc.h']]], + ['vmacreateallocator_277',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], + ['vmacreatebuffer_278',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], + ['vmacreateimage_279',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], + ['vmacreatelostallocation_280',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], + ['vmacreatepool_281',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], + ['vmadefragment_282',['vmaDefragment',['../vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac',1,'vk_mem_alloc.h']]], + ['vmadefragmentationbegin_283',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]], + ['vmadefragmentationend_284',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]], + ['vmadestroyallocator_285',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], + ['vmadestroybuffer_286',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], + ['vmadestroyimage_287',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], + ['vmadestroypool_288',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], + ['vmaenddefragmentationpass_289',['vmaEndDefragmentationPass',['../vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindex_290',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindexforbufferinfo_291',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindexforimageinfo_292',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]], + ['vmaflushallocation_293',['vmaFlushAllocation',['../vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f',1,'vk_mem_alloc.h']]], + ['vmaflushallocations_294',['vmaFlushAllocations',['../vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc',1,'vk_mem_alloc.h']]], + ['vmafreememory_295',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f',1,'vk_mem_alloc.h']]], + ['vmafreememorypages_296',['vmaFreeMemoryPages',['../vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e',1,'vk_mem_alloc.h']]], + ['vmafreestatsstring_297',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], + ['vmagetallocationinfo_298',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], + ['vmagetallocatorinfo_299',['vmaGetAllocatorInfo',['../vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7',1,'vk_mem_alloc.h']]], + ['vmagetbudget_300',['vmaGetBudget',['../vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba',1,'vk_mem_alloc.h']]], + ['vmagetmemoryproperties_301',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], + ['vmagetmemorytypeproperties_302',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], + ['vmagetphysicaldeviceproperties_303',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], + ['vmagetpoolname_304',['vmaGetPoolName',['../vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030',1,'vk_mem_alloc.h']]], + ['vmagetpoolstats_305',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], + ['vmainvalidateallocation_306',['vmaInvalidateAllocation',['../vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae',1,'vk_mem_alloc.h']]], + ['vmainvalidateallocations_307',['vmaInvalidateAllocations',['../vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5',1,'vk_mem_alloc.h']]], + ['vmamakepoolallocationslost_308',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], + ['vmamapmemory_309',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], + ['vmasetallocationuserdata_310',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], + ['vmasetcurrentframeindex_311',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], + ['vmasetpoolname_312',['vmaSetPoolName',['../vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58',1,'vk_mem_alloc.h']]], + ['vmatouchallocation_313',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]], + ['vmaunmapmemory_314',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html index 4377320..2b9360b 100644 --- a/docs/html/search/nomatches.html +++ b/docs/html/search/nomatches.html
@@ -1,5 +1,6 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="search.js"></script>
diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html index a281c4b..8517b48 100644 --- a/docs/html/search/pages_0.html +++ b/docs/html/search/pages_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js index 4061d84..70221e8 100644 --- a/docs/html/search/pages_0.js +++ b/docs/html/search/pages_0.js
@@ -1,4 +1,4 @@ var searchData= [ - ['allocation_20names_20and_20user_20data_479',['Allocation names and user data',['../allocation_annotation.html',1,'index']]] + ['allocation_20names_20and_20user_20data_487',['Allocation names and user data',['../allocation_annotation.html',1,'index']]] ];
diff --git a/docs/html/search/pages_1.html b/docs/html/search/pages_1.html index 0e1cf6b..a0fb679 100644 --- a/docs/html/search/pages_1.html +++ b/docs/html/search/pages_1.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_1.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_1.js b/docs/html/search/pages_1.js index dccc33a..ecde0fc 100644 --- a/docs/html/search/pages_1.js +++ b/docs/html/search/pages_1.js
@@ -1,6 +1,6 @@ var searchData= [ - ['choosing_20memory_20type_480',['Choosing memory type',['../choosing_memory_type.html',1,'index']]], - ['configuration_481',['Configuration',['../configuration.html',1,'index']]], - ['custom_20memory_20pools_482',['Custom memory pools',['../custom_memory_pools.html',1,'index']]] + ['choosing_20memory_20type_488',['Choosing memory type',['../choosing_memory_type.html',1,'index']]], + ['configuration_489',['Configuration',['../configuration.html',1,'index']]], + ['custom_20memory_20pools_490',['Custom memory pools',['../custom_memory_pools.html',1,'index']]] ];
diff --git a/docs/html/search/pages_2.html b/docs/html/search/pages_2.html index e11214c..084edfd 100644 --- a/docs/html/search/pages_2.html +++ b/docs/html/search/pages_2.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_2.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_2.js b/docs/html/search/pages_2.js index 243ecd8..a1a0ce8 100644 --- a/docs/html/search/pages_2.js +++ b/docs/html/search/pages_2.js
@@ -1,6 +1,6 @@ var searchData= [ - ['debugging_20incorrect_20memory_20usage_483',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]], - ['defragmentation_484',['Defragmentation',['../defragmentation.html',1,'index']]], - ['deprecated_20list_485',['Deprecated List',['../deprecated.html',1,'']]] + ['debugging_20incorrect_20memory_20usage_491',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]], + ['defragmentation_492',['Defragmentation',['../defragmentation.html',1,'index']]], + ['deprecated_20list_493',['Deprecated List',['../deprecated.html',1,'']]] ];
diff --git a/docs/html/search/pages_3.html b/docs/html/search/pages_3.html index c509f11..c0b45b0 100644 --- a/docs/html/search/pages_3.html +++ b/docs/html/search/pages_3.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_3.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_3.js b/docs/html/search/pages_3.js index 41e1306..3573a9f 100644 --- a/docs/html/search/pages_3.js +++ b/docs/html/search/pages_3.js
@@ -1,4 +1,4 @@ var searchData= [ - ['enabling_20buffer_20device_20address_486',['Enabling buffer device address',['../enabling_buffer_device_address.html',1,'index']]] + ['enabling_20buffer_20device_20address_494',['Enabling buffer device address',['../enabling_buffer_device_address.html',1,'index']]] ];
diff --git a/docs/html/search/pages_4.html b/docs/html/search/pages_4.html index 7053756..0f05c2e 100644 --- a/docs/html/search/pages_4.html +++ b/docs/html/search/pages_4.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_4.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_4.js b/docs/html/search/pages_4.js index e0f0f18..f36b6ba 100644 --- a/docs/html/search/pages_4.js +++ b/docs/html/search/pages_4.js
@@ -1,4 +1,4 @@ var searchData= [ - ['general_20considerations_487',['General considerations',['../general_considerations.html',1,'index']]] + ['general_20considerations_495',['General considerations',['../general_considerations.html',1,'index']]] ];
diff --git a/docs/html/search/pages_5.html b/docs/html/search/pages_5.html index 937d0df..27e2b6c 100644 --- a/docs/html/search/pages_5.html +++ b/docs/html/search/pages_5.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_5.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_5.js b/docs/html/search/pages_5.js index 3c89987..a9aaced 100644 --- a/docs/html/search/pages_5.js +++ b/docs/html/search/pages_5.js
@@ -1,4 +1,4 @@ var searchData= [ - ['lost_20allocations_488',['Lost allocations',['../lost_allocations.html',1,'index']]] + ['lost_20allocations_496',['Lost allocations',['../lost_allocations.html',1,'index']]] ];
diff --git a/docs/html/search/pages_6.html b/docs/html/search/pages_6.html index d4a7645..39300b6 100644 --- a/docs/html/search/pages_6.html +++ b/docs/html/search/pages_6.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_6.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_6.js b/docs/html/search/pages_6.js index 161d809..96a7146 100644 --- a/docs/html/search/pages_6.js +++ b/docs/html/search/pages_6.js
@@ -1,4 +1,4 @@ var searchData= [ - ['memory_20mapping_489',['Memory mapping',['../memory_mapping.html',1,'index']]] + ['memory_20mapping_497',['Memory mapping',['../memory_mapping.html',1,'index']]] ];
diff --git a/docs/html/search/pages_7.html b/docs/html/search/pages_7.html index 3a4c975..c005fe5 100644 --- a/docs/html/search/pages_7.html +++ b/docs/html/search/pages_7.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_7.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_7.js b/docs/html/search/pages_7.js index d13f82a..2509b78 100644 --- a/docs/html/search/pages_7.js +++ b/docs/html/search/pages_7.js
@@ -1,4 +1,4 @@ var searchData= [ - ['quick_20start_490',['Quick start',['../quick_start.html',1,'index']]] + ['quick_20start_498',['Quick start',['../quick_start.html',1,'index']]] ];
diff --git a/docs/html/search/pages_8.html b/docs/html/search/pages_8.html index 1e5b01a..c942aa2 100644 --- a/docs/html/search/pages_8.html +++ b/docs/html/search/pages_8.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_8.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_8.js b/docs/html/search/pages_8.js index a0d5e79..1f17744 100644 --- a/docs/html/search/pages_8.js +++ b/docs/html/search/pages_8.js
@@ -1,6 +1,6 @@ var searchData= [ - ['record_20and_20replay_491',['Record and replay',['../record_and_replay.html',1,'index']]], - ['resource_20aliasing_20_28overlap_29_492',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]], - ['recommended_20usage_20patterns_493',['Recommended usage patterns',['../usage_patterns.html',1,'index']]] + ['recommended_20usage_20patterns_499',['Recommended usage patterns',['../usage_patterns.html',1,'index']]], + ['record_20and_20replay_500',['Record and replay',['../record_and_replay.html',1,'index']]], + ['resource_20aliasing_20_28overlap_29_501',['Resource aliasing (overlap)',['../resource_aliasing.html',1,'index']]] ];
diff --git a/docs/html/search/pages_9.html b/docs/html/search/pages_9.html index 111b90c..4199c40 100644 --- a/docs/html/search/pages_9.html +++ b/docs/html/search/pages_9.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_9.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_9.js b/docs/html/search/pages_9.js index eacae9b..8776de9 100644 --- a/docs/html/search/pages_9.js +++ b/docs/html/search/pages_9.js
@@ -1,5 +1,5 @@ var searchData= [ - ['statistics_494',['Statistics',['../statistics.html',1,'index']]], - ['staying_20within_20budget_495',['Staying within budget',['../staying_within_budget.html',1,'index']]] + ['statistics_502',['Statistics',['../statistics.html',1,'index']]], + ['staying_20within_20budget_503',['Staying within budget',['../staying_within_budget.html',1,'index']]] ];
diff --git a/docs/html/search/pages_a.html b/docs/html/search/pages_a.html index 6566619..2cc9d19 100644 --- a/docs/html/search/pages_a.html +++ b/docs/html/search/pages_a.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="pages_a.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/pages_a.js b/docs/html/search/pages_a.js index b8e1a18..7df5b57 100644 --- a/docs/html/search/pages_a.js +++ b/docs/html/search/pages_a.js
@@ -1,6 +1,6 @@ var searchData= [ - ['vulkan_20memory_20allocator_496',['Vulkan Memory Allocator',['../index.html',1,'']]], - ['vk_5famd_5fdevice_5fcoherent_5fmemory_497',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]], - ['vk_5fkhr_5fdedicated_5fallocation_498',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]] + ['vk_5famd_5fdevice_5fcoherent_5fmemory_504',['VK_AMD_device_coherent_memory',['../vk_amd_device_coherent_memory.html',1,'index']]], + ['vk_5fkhr_5fdedicated_5fallocation_505',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]], + ['vulkan_20memory_20allocator_506',['Vulkan Memory Allocator',['../index.html',1,'']]] ];
diff --git a/docs/html/search/search.css b/docs/html/search/search.css index 933cf08..9074198 100644 --- a/docs/html/search/search.css +++ b/docs/html/search/search.css
@@ -204,19 +204,21 @@ span.SRScope { padding-left: 4px; + font-family: Arial, Verdana, sans-serif; } .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; font-style: italic; + font-family: Arial, Verdana, sans-serif; } .SRResult { display: none; } -DIV.searchresults { +div.searchresults { margin-left: 10px; margin-right: 10px; }
diff --git a/docs/html/search/search.js b/docs/html/search/search.js index 92b6094..fb226f7 100644 --- a/docs/html/search/search.js +++ b/docs/html/search/search.js
@@ -80,9 +80,10 @@ storing this instance. Is needed to be able to set timeouts. resultPath - path to use for external files */ -function SearchBox(name, resultsPath, inFrame, label) +function SearchBox(name, resultsPath, inFrame, label, extension) { if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } // ---------- Instance variables this.name = name; @@ -97,6 +98,7 @@ this.searchActive = false; this.insideFrame = inFrame; this.searchLabel = label; + this.extension = extension; // ----------- DOM Elements @@ -347,13 +349,13 @@ if (idx!=-1) { var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; resultsPageWithSearch = resultsPage+'?'+escape(searchValue); hasResultsPage = true; } else // nothing available for this search term { - resultsPage = this.resultsPath + '/nomatches.html'; + resultsPage = this.resultsPath + '/nomatches' + this.extension; resultsPageWithSearch = resultsPage; hasResultsPage = false; } @@ -439,12 +441,12 @@ while (element && element!=parentElement) { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { return element; } - if (element.nodeName == 'DIV' && element.hasChildNodes()) + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { element = element.firstChild; }
diff --git a/docs/html/search/typedefs_0.html b/docs/html/search/typedefs_0.html index b66f0a7..a4684c4 100644 --- a/docs/html/search/typedefs_0.html +++ b/docs/html/search/typedefs_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="typedefs_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/typedefs_0.js b/docs/html/search/typedefs_0.js index 6475b90..9f5477f 100644 --- a/docs/html/search/typedefs_0.js +++ b/docs/html/search/typedefs_0.js
@@ -1,5 +1,5 @@ var searchData= [ - ['pfn_5fvmaallocatedevicememoryfunction_395',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]], - ['pfn_5fvmafreedevicememoryfunction_396',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]] + ['pfn_5fvmaallocatedevicememoryfunction_401',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3',1,'vk_mem_alloc.h']]], + ['pfn_5fvmafreedevicememoryfunction_402',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/typedefs_1.html b/docs/html/search/typedefs_1.html index bca8d76..46cf01e 100644 --- a/docs/html/search/typedefs_1.html +++ b/docs/html/search/typedefs_1.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="typedefs_1.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js index cd8fdb1..af09f0d 100644 --- a/docs/html/search/typedefs_1.js +++ b/docs/html/search/typedefs_1.js
@@ -1,31 +1,31 @@ var searchData= [ - ['vmaallocationcreateflagbits_397',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'vk_mem_alloc.h']]], - ['vmaallocationcreateflags_398',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], - ['vmaallocationcreateinfo_399',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'vk_mem_alloc.h']]], - ['vmaallocationinfo_400',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'vk_mem_alloc.h']]], - ['vmaallocatorcreateflagbits_401',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'vk_mem_alloc.h']]], - ['vmaallocatorcreateflags_402',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]], - ['vmaallocatorcreateinfo_403',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'vk_mem_alloc.h']]], - ['vmaallocatorinfo_404',['VmaAllocatorInfo',['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'vk_mem_alloc.h']]], - ['vmabudget_405',['VmaBudget',['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'vk_mem_alloc.h']]], - ['vmadefragmentationflagbits_406',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'vk_mem_alloc.h']]], - ['vmadefragmentationflags_407',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]], - ['vmadefragmentationinfo_408',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'vk_mem_alloc.h']]], - ['vmadefragmentationinfo2_409',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'vk_mem_alloc.h']]], - ['vmadefragmentationpassinfo_410',['VmaDefragmentationPassInfo',['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'vk_mem_alloc.h']]], - ['vmadefragmentationpassmoveinfo_411',['VmaDefragmentationPassMoveInfo',['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'vk_mem_alloc.h']]], - ['vmadefragmentationstats_412',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'vk_mem_alloc.h']]], - ['vmadevicememorycallbacks_413',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'vk_mem_alloc.h']]], - ['vmamemoryusage_414',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'vk_mem_alloc.h']]], - ['vmapoolcreateflagbits_415',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'vk_mem_alloc.h']]], - ['vmapoolcreateflags_416',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], - ['vmapoolcreateinfo_417',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'vk_mem_alloc.h']]], - ['vmapoolstats_418',['VmaPoolStats',['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'vk_mem_alloc.h']]], - ['vmarecordflagbits_419',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'vk_mem_alloc.h']]], - ['vmarecordflags_420',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]], - ['vmarecordsettings_421',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'vk_mem_alloc.h']]], - ['vmastatinfo_422',['VmaStatInfo',['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'vk_mem_alloc.h']]], - ['vmastats_423',['VmaStats',['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'vk_mem_alloc.h']]], - ['vmavulkanfunctions_424',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'vk_mem_alloc.h']]] + ['vmaallocationcreateflagbits_403',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateflags_404',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateinfo_405',['VmaAllocationCreateInfo',['../vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a',1,'vk_mem_alloc.h']]], + ['vmaallocationinfo_406',['VmaAllocationInfo',['../vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50',1,'vk_mem_alloc.h']]], + ['vmaallocatorcreateflagbits_407',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f',1,'vk_mem_alloc.h']]], + ['vmaallocatorcreateflags_408',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]], + ['vmaallocatorcreateinfo_409',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a',1,'vk_mem_alloc.h']]], + ['vmaallocatorinfo_410',['VmaAllocatorInfo',['../vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c',1,'vk_mem_alloc.h']]], + ['vmabudget_411',['VmaBudget',['../vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d',1,'vk_mem_alloc.h']]], + ['vmadefragmentationflagbits_412',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc',1,'vk_mem_alloc.h']]], + ['vmadefragmentationflags_413',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]], + ['vmadefragmentationinfo_414',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa',1,'vk_mem_alloc.h']]], + ['vmadefragmentationinfo2_415',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937',1,'vk_mem_alloc.h']]], + ['vmadefragmentationpassinfo_416',['VmaDefragmentationPassInfo',['../vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e',1,'vk_mem_alloc.h']]], + ['vmadefragmentationpassmoveinfo_417',['VmaDefragmentationPassMoveInfo',['../vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5',1,'vk_mem_alloc.h']]], + ['vmadefragmentationstats_418',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403',1,'vk_mem_alloc.h']]], + ['vmadevicememorycallbacks_419',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b',1,'vk_mem_alloc.h']]], + ['vmamemoryusage_420',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflagbits_421',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflags_422',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], + ['vmapoolcreateinfo_423',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67',1,'vk_mem_alloc.h']]], + ['vmapoolstats_424',['VmaPoolStats',['../vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1',1,'vk_mem_alloc.h']]], + ['vmarecordflagbits_425',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413',1,'vk_mem_alloc.h']]], + ['vmarecordflags_426',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]], + ['vmarecordsettings_427',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc',1,'vk_mem_alloc.h']]], + ['vmastatinfo_428',['VmaStatInfo',['../vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878',1,'vk_mem_alloc.h']]], + ['vmastats_429',['VmaStats',['../vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034',1,'vk_mem_alloc.h']]], + ['vmavulkanfunctions_430',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074',1,'vk_mem_alloc.h']]] ];
diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html index 2edd111..1e477c0 100644 --- a/docs/html/search/variables_0.html +++ b/docs/html/search/variables_0.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_0.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js index c301aa7..b48c4e6 100644 --- a/docs/html/search/variables_0.js +++ b/docs/html/search/variables_0.js
@@ -1,10 +1,10 @@ var searchData= [ - ['allocation_312',['allocation',['../struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc',1,'VmaDefragmentationPassMoveInfo']]], - ['allocationbytes_313',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]], - ['allocationcount_314',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]], - ['allocationsizeavg_315',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]], - ['allocationsizemax_316',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]], - ['allocationsizemin_317',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]], - ['allocationsmoved_318',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]] + ['allocation_315',['allocation',['../struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc',1,'VmaDefragmentationPassMoveInfo']]], + ['allocationbytes_316',['allocationBytes',['../struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8',1,'VmaBudget']]], + ['allocationcount_317',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba',1,'VmaDefragmentationInfo2::allocationCount()']]], + ['allocationsizeavg_318',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]], + ['allocationsizemax_319',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]], + ['allocationsizemin_320',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]], + ['allocationsmoved_321',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]] ];
diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html index 98b95a9..ea73d9a 100644 --- a/docs/html/search/variables_1.html +++ b/docs/html/search/variables_1.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_1.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js index 8b6acfe..8466fe9 100644 --- a/docs/html/search/variables_1.js +++ b/docs/html/search/variables_1.js
@@ -1,9 +1,9 @@ var searchData= [ - ['blockbytes_319',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]], - ['blockcount_320',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]], - ['blocksize_321',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]], - ['budget_322',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]], - ['bytesfreed_323',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]], - ['bytesmoved_324',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]] + ['blockbytes_322',['blockBytes',['../struct_vma_budget.html#a58b492901baab685f466199124e514a0',1,'VmaBudget']]], + ['blockcount_323',['blockCount',['../struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4',1,'VmaStatInfo::blockCount()'],['../struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7',1,'VmaPoolStats::blockCount()']]], + ['blocksize_324',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]], + ['budget_325',['budget',['../struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd',1,'VmaBudget']]], + ['bytesfreed_326',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]], + ['bytesmoved_327',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]] ];
diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html index 3e0c591..0580462 100644 --- a/docs/html/search/variables_2.html +++ b/docs/html/search/variables_2.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_2.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js index 3754879..26c79ea 100644 --- a/docs/html/search/variables_2.js +++ b/docs/html/search/variables_2.js
@@ -1,4 +1,4 @@ var searchData= [ - ['commandbuffer_325',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]] + ['commandbuffer_328',['commandBuffer',['../struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd',1,'VmaDefragmentationInfo2']]] ];
diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html index 7867da3..0d69e76 100644 --- a/docs/html/search/variables_3.html +++ b/docs/html/search/variables_3.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_3.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js index 3335fa9..7235a7e 100644 --- a/docs/html/search/variables_3.js +++ b/docs/html/search/variables_3.js
@@ -1,6 +1,6 @@ var searchData= [ - ['device_326',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo::device()'],['../struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357',1,'VmaAllocatorInfo::device()']]], - ['devicememory_327',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]], - ['devicememoryblocksfreed_328',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]] + ['device_329',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo::device()'],['../struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357',1,'VmaAllocatorInfo::device()']]], + ['devicememory_330',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]], + ['devicememoryblocksfreed_331',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]] ];
diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html index 732dee2..a4b6506 100644 --- a/docs/html/search/variables_4.html +++ b/docs/html/search/variables_4.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_4.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js index 332a035..6688225 100644 --- a/docs/html/search/variables_4.js +++ b/docs/html/search/variables_4.js
@@ -1,5 +1,5 @@ var searchData= [ - ['flags_329',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]], - ['frameinusecount_330',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]] + ['flags_332',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]], + ['frameinusecount_333',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]] ];
diff --git a/docs/html/search/variables_5.html b/docs/html/search/variables_5.html index ad9b545..7e345d1 100644 --- a/docs/html/search/variables_5.html +++ b/docs/html/search/variables_5.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_5.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js index 7327328..017812a 100644 --- a/docs/html/search/variables_5.js +++ b/docs/html/search/variables_5.js
@@ -1,4 +1,4 @@ var searchData= [ - ['instance_331',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo::instance()'],['../struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe',1,'VmaAllocatorInfo::instance()']]] + ['instance_334',['instance',['../struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b',1,'VmaAllocatorCreateInfo::instance()'],['../struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe',1,'VmaAllocatorInfo::instance()']]] ];
diff --git a/docs/html/search/variables_6.html b/docs/html/search/variables_6.html index 1cf2da1..7d48e75 100644 --- a/docs/html/search/variables_6.html +++ b/docs/html/search/variables_6.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_6.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js index 6f721c4..5f259cd 100644 --- a/docs/html/search/variables_6.js +++ b/docs/html/search/variables_6.js
@@ -1,17 +1,18 @@ var searchData= [ - ['maxallocationstomove_332',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]], - ['maxblockcount_333',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]], - ['maxbytestomove_334',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]], - ['maxcpuallocationstomove_335',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]], - ['maxcpubytestomove_336',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]], - ['maxgpuallocationstomove_337',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]], - ['maxgpubytestomove_338',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]], - ['memory_339',['memory',['../struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769',1,'VmaDefragmentationPassMoveInfo']]], - ['memoryheap_340',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], - ['memorytype_341',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], - ['memorytypebits_342',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]], - ['memorytypeindex_343',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], - ['minblockcount_344',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]], - ['movecount_345',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]] + ['maxallocationstomove_335',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]], + ['maxblockcount_336',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]], + ['maxbytestomove_337',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]], + ['maxcpuallocationstomove_338',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]], + ['maxcpubytestomove_339',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]], + ['maxgpuallocationstomove_340',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]], + ['maxgpubytestomove_341',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]], + ['memory_342',['memory',['../struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769',1,'VmaDefragmentationPassMoveInfo']]], + ['memoryheap_343',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], + ['memorytype_344',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], + ['memorytypebits_345',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]], + ['memorytypeindex_346',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], + ['minallocationalignment_347',['minAllocationAlignment',['../struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb',1,'VmaPoolCreateInfo']]], + ['minblockcount_348',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]], + ['movecount_349',['moveCount',['../struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c',1,'VmaDefragmentationPassInfo']]] ];
diff --git a/docs/html/search/variables_7.html b/docs/html/search/variables_7.html index ab2db0b..5c26340 100644 --- a/docs/html/search/variables_7.html +++ b/docs/html/search/variables_7.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_7.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js index 13aadd0..6393984 100644 --- a/docs/html/search/variables_7.js +++ b/docs/html/search/variables_7.js
@@ -1,4 +1,4 @@ var searchData= [ - ['offset_346',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]] + ['offset_350',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo::offset()'],['../struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6',1,'VmaDefragmentationPassMoveInfo::offset()']]] ];
diff --git a/docs/html/search/variables_8.html b/docs/html/search/variables_8.html index baec040..dc9ec54 100644 --- a/docs/html/search/variables_8.html +++ b/docs/html/search/variables_8.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_8.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js index 408b163..350dc1a 100644 --- a/docs/html/search/variables_8.js +++ b/docs/html/search/variables_8.js
@@ -1,22 +1,24 @@ var searchData= [ - ['pallocationcallbacks_347',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]], - ['pallocations_348',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]], - ['pallocationschanged_349',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]], - ['pdevicememorycallbacks_350',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]], - ['pfilepath_351',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]], - ['pfnallocate_352',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]], - ['pfnfree_353',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], - ['pheapsizelimit_354',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]], - ['physicaldevice_355',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]], - ['pmappeddata_356',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], - ['pmoves_357',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]], - ['pool_358',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], - ['poolcount_359',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]], - ['ppools_360',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]], - ['precordsettings_361',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]], - ['preferredflags_362',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], - ['preferredlargeheapblocksize_363',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], - ['puserdata_364',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]], - ['pvulkanfunctions_365',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]] + ['pallocationcallbacks_351',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]], + ['pallocations_352',['pAllocations',['../struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32',1,'VmaDefragmentationInfo2']]], + ['pallocationschanged_353',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]], + ['pdevicememorycallbacks_354',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]], + ['pfilepath_355',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]], + ['pfnallocate_356',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]], + ['pfnfree_357',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], + ['pheapsizelimit_358',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]], + ['physicaldevice_359',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo::physicalDevice()'],['../struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a',1,'VmaAllocatorInfo::physicalDevice()']]], + ['pmappeddata_360',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], + ['pmemoryallocatenext_361',['pMemoryAllocateNext',['../struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7',1,'VmaPoolCreateInfo']]], + ['pmoves_362',['pMoves',['../struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792',1,'VmaDefragmentationPassInfo']]], + ['pool_363',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], + ['poolcount_364',['poolCount',['../struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d',1,'VmaDefragmentationInfo2']]], + ['ppools_365',['pPools',['../struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b',1,'VmaDefragmentationInfo2']]], + ['precordsettings_366',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]], + ['preferredflags_367',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], + ['preferredlargeheapblocksize_368',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], + ['priority_369',['priority',['../struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7',1,'VmaAllocationCreateInfo::priority()'],['../struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274',1,'VmaPoolCreateInfo::priority()']]], + ['puserdata_370',['pUserData',['../struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6',1,'VmaDeviceMemoryCallbacks::pUserData()'],['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]], + ['pvulkanfunctions_371',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]] ];
diff --git a/docs/html/search/variables_9.html b/docs/html/search/variables_9.html index df2fea0..7b01475 100644 --- a/docs/html/search/variables_9.html +++ b/docs/html/search/variables_9.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_9.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_9.js b/docs/html/search/variables_9.js index 464801a..ca5e74e 100644 --- a/docs/html/search/variables_9.js +++ b/docs/html/search/variables_9.js
@@ -1,4 +1,4 @@ var searchData= [ - ['requiredflags_366',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]] + ['requiredflags_372',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]] ];
diff --git a/docs/html/search/variables_a.html b/docs/html/search/variables_a.html index c7491ab..52a724d 100644 --- a/docs/html/search/variables_a.html +++ b/docs/html/search/variables_a.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_a.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js index 096c052..2718e5d 100644 --- a/docs/html/search/variables_a.js +++ b/docs/html/search/variables_a.js
@@ -1,4 +1,4 @@ var searchData= [ - ['size_367',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]] + ['size_373',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]] ];
diff --git a/docs/html/search/variables_b.html b/docs/html/search/variables_b.html index 371f07a..f376b27 100644 --- a/docs/html/search/variables_b.html +++ b/docs/html/search/variables_b.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_b.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js index 8ba1d7d..5fa92c4 100644 --- a/docs/html/search/variables_b.js +++ b/docs/html/search/variables_b.js
@@ -1,4 +1,4 @@ var searchData= [ - ['total_368',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]] + ['total_374',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]] ];
diff --git a/docs/html/search/variables_c.html b/docs/html/search/variables_c.html index c89b8de..6019eba 100644 --- a/docs/html/search/variables_c.html +++ b/docs/html/search/variables_c.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_c.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js index a6b01a4..d16c013 100644 --- a/docs/html/search/variables_c.js +++ b/docs/html/search/variables_c.js
@@ -1,11 +1,11 @@ var searchData= [ - ['unusedbytes_369',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]], - ['unusedrangecount_370',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], - ['unusedrangesizeavg_371',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]], - ['unusedrangesizemax_372',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]], - ['unusedrangesizemin_373',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]], - ['unusedsize_374',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], - ['usage_375',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]], - ['usedbytes_376',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]] + ['unusedbytes_375',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]], + ['unusedrangecount_376',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], + ['unusedrangesizeavg_377',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]], + ['unusedrangesizemax_378',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]], + ['unusedrangesizemin_379',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]], + ['unusedsize_380',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], + ['usage_381',['usage',['../struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6',1,'VmaBudget::usage()'],['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo::usage()']]], + ['usedbytes_382',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]] ];
diff --git a/docs/html/search/variables_d.html b/docs/html/search/variables_d.html index a73000d..f61ae75 100644 --- a/docs/html/search/variables_d.html +++ b/docs/html/search/variables_d.html
@@ -1,7 +1,8 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html><head><title></title> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title></title> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <link rel="stylesheet" type="text/css" href="search.css"/> <script type="text/javascript" src="variables_d.js"></script> <script type="text/javascript" src="search.js"></script> @@ -10,14 +11,14 @@ <div id="SRIndex"> <div class="SRStatus" id="Loading">Loading...</div> <div id="SRResults"></div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ createResults(); /* @license-end */ ---></script> +</script> <div class="SRStatus" id="Searching">Searching...</div> <div class="SRStatus" id="NoMatches">No Matches</div> -<script type="text/javascript"><!-- +<script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ document.getElementById("Loading").style.display="none"; document.getElementById("NoMatches").style.display="none"; @@ -30,7 +31,7 @@ } }); /* @license-end */ ---></script> +</script> </div> </body> </html>
diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js index 108e48a..afed120 100644 --- a/docs/html/search/variables_d.js +++ b/docs/html/search/variables_d.js
@@ -1,21 +1,21 @@ var searchData= [ - ['vkallocatememory_377',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]], - ['vkbindbuffermemory_378',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]], - ['vkbindimagememory_379',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]], - ['vkcmdcopybuffer_380',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]], - ['vkcreatebuffer_381',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]], - ['vkcreateimage_382',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]], - ['vkdestroybuffer_383',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]], - ['vkdestroyimage_384',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]], - ['vkflushmappedmemoryranges_385',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]], - ['vkfreememory_386',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]], - ['vkgetbuffermemoryrequirements_387',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]], - ['vkgetimagememoryrequirements_388',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]], - ['vkgetphysicaldevicememoryproperties_389',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]], - ['vkgetphysicaldeviceproperties_390',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]], - ['vkinvalidatemappedmemoryranges_391',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]], - ['vkmapmemory_392',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]], - ['vkunmapmemory_393',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]], - ['vulkanapiversion_394',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]] + ['vkallocatememory_383',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]], + ['vkbindbuffermemory_384',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]], + ['vkbindimagememory_385',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]], + ['vkcmdcopybuffer_386',['vkCmdCopyBuffer',['../struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a',1,'VmaVulkanFunctions']]], + ['vkcreatebuffer_387',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]], + ['vkcreateimage_388',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]], + ['vkdestroybuffer_389',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]], + ['vkdestroyimage_390',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]], + ['vkflushmappedmemoryranges_391',['vkFlushMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9',1,'VmaVulkanFunctions']]], + ['vkfreememory_392',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]], + ['vkgetbuffermemoryrequirements_393',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]], + ['vkgetimagememoryrequirements_394',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]], + ['vkgetphysicaldevicememoryproperties_395',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]], + ['vkgetphysicaldeviceproperties_396',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]], + ['vkinvalidatemappedmemoryranges_397',['vkInvalidateMappedMemoryRanges',['../struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1',1,'VmaVulkanFunctions']]], + ['vkmapmemory_398',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]], + ['vkunmapmemory_399',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]], + ['vulkanapiversion_400',['vulkanApiVersion',['../struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285',1,'VmaAllocatorCreateInfo']]] ];
diff --git a/docs/html/statistics.html b/docs/html/statistics.html index 03b6bad..796dbf8 100644 --- a/docs/html/statistics.html +++ b/docs/html/statistics.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Statistics</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -84,7 +84,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/staying_within_budget.html b/docs/html/staying_within_budget.html index 1608f24..d43cb5b 100644 --- a/docs/html/staying_within_budget.html +++ b/docs/html/staying_within_budget.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Staying within budget</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -98,7 +98,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocation.html b/docs/html/struct_vma_allocation.html index 3b4779e..fa8c5ca 100644 --- a/docs/html/struct_vma_allocation.html +++ b/docs/html/struct_vma_allocation.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocation Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -78,12 +78,12 @@ <p>The object also remembers its size and some other information. To retrieve this information, use function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and inspect returned structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().">VmaAllocationInfo</a>.</p> <p>Some kinds allocations can be in lost state. For more information, see <a class="el" href="lost_allocations.html">Lost allocations</a>. </p> </div><hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocation_create_info-members.html b/docs/html/struct_vma_allocation_create_info-members.html index cfe2f43..a97d4f7 100644 --- a/docs/html/struct_vma_allocation_create_info-members.html +++ b/docs/html/struct_vma_allocation_create_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -72,13 +72,14 @@ <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> - <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> - <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> - <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> + <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> + <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> + <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> + <tr><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a></td><td class="entry"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td><td class="entry"></td></tr> </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocation_create_info.html b/docs/html/struct_vma_allocation_create_info.html index fe5c356..8bf1e6a 100644 --- a/docs/html/struct_vma_allocation_create_info.html +++ b/docs/html/struct_vma_allocation_create_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocationCreateInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -94,6 +94,9 @@ <tr class="memitem:a8259e85c272683434f4abb4ddddffe19"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td></tr> <tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft"> </td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation.">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value.">vmaSetAllocationUserData()</a>. <a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr> <tr class="separator:a8259e85c272683434f4abb4ddddffe19"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="memItemLeft" align="right" valign="top">float </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a></td></tr> +<tr class="memdesc:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="mdescLeft"> </td><td class="mdescRight">A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. <a href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">More...</a><br /></td></tr> +<tr class="separator:a983d39e1a2e63649d78a960aa2fdd0f7"><td class="memSeparator" colspan="2"> </td></tr> </table> <h2 class="groupheader">Member Data Documentation</h2> <a id="add09658ac14fe290ace25470ddd6d41b"></a> @@ -165,6 +168,23 @@ </div> </div> +<a id="a983d39e1a2e63649d78a960aa2fdd0f7"></a> +<h2 class="memtitle"><span class="permalink"><a href="#a983d39e1a2e63649d78a960aa2fdd0f7">◆ </a></span>priority</h2> + +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">float VmaAllocationCreateInfo::priority</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>A floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. </p> +<p>It is used only when <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> flag was used during creation of the <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object and this allocation ends up as dedicated or is explicitly forced as dedicated using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>. Otherwise, it has the priority of a memory block where it is placed and this variable is ignored. </p> + +</div> +</div> <a id="a8259e85c272683434f4abb4ddddffe19"></a> <h2 class="memtitle"><span class="permalink"><a href="#a8259e85c272683434f4abb4ddddffe19">◆ </a></span>pUserData</h2> @@ -219,12 +239,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocation_info-members.html b/docs/html/struct_vma_allocation_info-members.html index 2f0eb72..7556c0a 100644 --- a/docs/html/struct_vma_allocation_info-members.html +++ b/docs/html/struct_vma_allocation_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -77,7 +77,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocation_info.html b/docs/html/struct_vma_allocation_info.html index fbc824e..85de4aa 100644 --- a/docs/html/struct_vma_allocation_info.html +++ b/docs/html/struct_vma_allocation_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocationInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -83,7 +83,7 @@ <tr class="memdesc:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="mdescLeft"> </td><td class="mdescRight">Handle to Vulkan memory object. <a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">More...</a><br /></td></tr> <tr class="separator:ae0bfb7dfdf79a76ffefc9a94677a2f67"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a4a3c732388dbdc7a23f9365b00825268"><td class="memItemLeft" align="right" valign="top">VkDeviceSize </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a></td></tr> -<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft"> </td><td class="mdescRight">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. <a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr> +<tr class="memdesc:a4a3c732388dbdc7a23f9365b00825268"><td class="mdescLeft"> </td><td class="mdescRight">Offset in <code>VkDeviceMemory</code> object to the beginning of this allocation, in bytes. <code>(deviceMemory, offset)</code> pair is unique to this allocation. <a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">More...</a><br /></td></tr> <tr class="separator:a4a3c732388dbdc7a23f9365b00825268"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="memItemLeft" align="right" valign="top">VkDeviceSize </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a></td></tr> <tr class="memdesc:aac76d113a6a5ccbb09fea00fb25fd18f"><td class="mdescLeft"> </td><td class="mdescRight">Size of this allocation, in bytes. <a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">More...</a><br /></td></tr> @@ -146,7 +146,8 @@ </table> </div><div class="memdoc"> -<p>Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </p> +<p>Offset in <code>VkDeviceMemory</code> object to the beginning of this allocation, in bytes. <code>(deviceMemory, offset)</code> pair is unique to this allocation. </p> +<p>You usually don't need to use this offset. If you create a buffer or an image together with the allocation using e.g. function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer().">vmaCreateImage()</a>, functions that operate on these resources refer to the beginning of the buffer or image, not entire device memory block. Functions like <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation.">vmaBindBufferMemory()</a> also refer to the beginning of the allocation and apply this offset automatically.</p> <p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a> if this allocation is passed to the function, or if allocation is lost. </p> </div> @@ -205,12 +206,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocator.html b/docs/html/struct_vma_allocator.html index c5acb34..0ef385f 100644 --- a/docs/html/struct_vma_allocator.html +++ b/docs/html/struct_vma_allocator.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocator Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -75,12 +75,12 @@ <p>Fill structure <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created.">VmaAllocatorCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object.">vmaCreateAllocator()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d" title="Destroys allocator object.">vmaDestroyAllocator()</a> to destroy it.</p> <p>It is recommended to create just one object of this type per <code>VkDevice</code> object, right after Vulkan is initialized and keep it alive until before Vulkan device is destroyed. </p> </div><hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocator_create_info-members.html b/docs/html/struct_vma_allocator_create_info-members.html index 2aaf55b..732b6ce 100644 --- a/docs/html/struct_vma_allocator_create_info-members.html +++ b/docs/html/struct_vma_allocator_create_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -83,7 +83,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocator_create_info.html b/docs/html/struct_vma_allocator_create_info.html index 46a7118..4a9b64b 100644 --- a/docs/html/struct_vma_allocator_create_info.html +++ b/docs/html/struct_vma_allocator_create_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocatorCreateInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -324,17 +324,17 @@ </div><div class="memdoc"> <p>Optional. The highest version of Vulkan that the application is designed to use. </p> -<p>It must be a value in the format as created by macro <code>VK_MAKE_VERSION</code> or a constant like: <code>VK_API_VERSION_1_1</code>, <code>VK_API_VERSION_1_0</code>. The patch version number specified is ignored. Only the major and minor versions are considered. It must be less or equal (preferably equal) to value as passed to <code>vkCreateInstance</code> as <code>VkApplicationInfo::apiVersion</code>. Only versions 1.0 and 1.1 are supported by the current implementation. Leaving it initialized to zero is equivalent to <code>VK_API_VERSION_1_0</code>. </p> +<p>It must be a value in the format as created by macro <code>VK_MAKE_VERSION</code> or a constant like: <code>VK_API_VERSION_1_1</code>, <code>VK_API_VERSION_1_0</code>. The patch version number specified is ignored. Only the major and minor versions are considered. It must be less or equal (preferably equal) to value as passed to <code>vkCreateInstance</code> as <code>VkApplicationInfo::apiVersion</code>. Only versions 1.0, 1.1, 1.2 are supported by the current implementation. Leaving it initialized to zero is equivalent to <code>VK_API_VERSION_1_0</code>. </p> </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocator_info-members.html b/docs/html/struct_vma_allocator_info-members.html index c34decb..e3bfe36 100644 --- a/docs/html/struct_vma_allocator_info-members.html +++ b/docs/html/struct_vma_allocator_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,7 +74,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_allocator_info.html b/docs/html/struct_vma_allocator_info.html index 03485d6..4457391 100644 --- a/docs/html/struct_vma_allocator_info.html +++ b/docs/html/struct_vma_allocator_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaAllocatorInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -141,12 +141,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_budget-members.html b/docs/html/struct_vma_budget-members.html index 39fae2a..209d1a2 100644 --- a/docs/html/struct_vma_budget-members.html +++ b/docs/html/struct_vma_budget-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -75,7 +75,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_budget.html b/docs/html/struct_vma_budget.html index e9270fe..c5dae45 100644 --- a/docs/html/struct_vma_budget.html +++ b/docs/html/struct_vma_budget.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaBudget Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -163,12 +163,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_context.html b/docs/html/struct_vma_defragmentation_context.html index 7ac19dd..74e29b9 100644 --- a/docs/html/struct_vma_defragmentation_context.html +++ b/docs/html/struct_vma_defragmentation_context.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationContext Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,12 +74,12 @@ <div class="textblock"><p>Represents Opaque object that represents started defragmentation process. </p> <p>Fill structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process.">vmaDefragmentationEnd()</a> to destroy it. </p> </div><hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_info-members.html b/docs/html/struct_vma_defragmentation_info-members.html index 67f4755..9ca5100 100644 --- a/docs/html/struct_vma_defragmentation_info-members.html +++ b/docs/html/struct_vma_defragmentation_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,7 +73,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_info.html b/docs/html/struct_vma_defragmentation_info.html index b269361..36e76c5 100644 --- a/docs/html/struct_vma_defragmentation_info.html +++ b/docs/html/struct_vma_defragmentation_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -85,7 +85,7 @@ </table> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <div class="textblock"><p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p> -<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl> +<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl> </div><h2 class="groupheader">Member Data Documentation</h2> <a id="aa7c7304e13c71f604c907196c4e28fbc"></a> <h2 class="memtitle"><span class="permalink"><a href="#aa7c7304e13c71f604c907196c4e28fbc">◆ </a></span>maxAllocationsToMove</h2> @@ -122,12 +122,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_info2-members.html b/docs/html/struct_vma_defragmentation_info2-members.html index 1c0cc43..3c01166 100644 --- a/docs/html/struct_vma_defragmentation_info2-members.html +++ b/docs/html/struct_vma_defragmentation_info2-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -82,7 +82,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_info2.html b/docs/html/struct_vma_defragmentation_info2.html index 8fbea7f..9894ec2 100644 --- a/docs/html/struct_vma_defragmentation_info2.html +++ b/docs/html/struct_vma_defragmentation_info2.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationInfo2 Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -302,12 +302,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_pass_info-members.html b/docs/html/struct_vma_defragmentation_pass_info-members.html index 15924b1..472df8c 100644 --- a/docs/html/struct_vma_defragmentation_pass_info-members.html +++ b/docs/html/struct_vma_defragmentation_pass_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,7 +73,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_pass_info.html b/docs/html/struct_vma_defragmentation_pass_info.html index 27433b3..fa74c06 100644 --- a/docs/html/struct_vma_defragmentation_pass_info.html +++ b/docs/html/struct_vma_defragmentation_pass_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationPassInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -114,12 +114,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_pass_move_info-members.html b/docs/html/struct_vma_defragmentation_pass_move_info-members.html index 1831d6b..61f0179 100644 --- a/docs/html/struct_vma_defragmentation_pass_move_info-members.html +++ b/docs/html/struct_vma_defragmentation_pass_move_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,7 +74,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_pass_move_info.html b/docs/html/struct_vma_defragmentation_pass_move_info.html index cda8de9..5486f41 100644 --- a/docs/html/struct_vma_defragmentation_pass_move_info.html +++ b/docs/html/struct_vma_defragmentation_pass_move_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationPassMoveInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -124,12 +124,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_stats-members.html b/docs/html/struct_vma_defragmentation_stats-members.html index 0a99c8a..ac8b730 100644 --- a/docs/html/struct_vma_defragmentation_stats-members.html +++ b/docs/html/struct_vma_defragmentation_stats-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -75,7 +75,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_defragmentation_stats.html b/docs/html/struct_vma_defragmentation_stats.html index db970d4..40acee8 100644 --- a/docs/html/struct_vma_defragmentation_stats.html +++ b/docs/html/struct_vma_defragmentation_stats.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDefragmentationStats Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -157,12 +157,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_device_memory_callbacks-members.html b/docs/html/struct_vma_device_memory_callbacks-members.html index 1827d5a..4c3ff43 100644 --- a/docs/html/struct_vma_device_memory_callbacks-members.html +++ b/docs/html/struct_vma_device_memory_callbacks-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,7 +74,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_device_memory_callbacks.html b/docs/html/struct_vma_device_memory_callbacks.html index d3d2c29..6cc3a20 100644 --- a/docs/html/struct_vma_device_memory_callbacks.html +++ b/docs/html/struct_vma_device_memory_callbacks.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaDeviceMemoryCallbacks Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -140,12 +140,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_pool.html b/docs/html/struct_vma_pool.html index 77eabae..b9eaa8b 100644 --- a/docs/html/struct_vma_pool.html +++ b/docs/html/struct_vma_pool.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaPool Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -75,12 +75,12 @@ <p>Fill structure <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool.">VmaPoolCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object.">vmaCreatePool()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1" title="Destroys VmaPool object and frees Vulkan device memory.">vmaDestroyPool()</a> to destroy it.</p> <p>For more information see <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>. </p> </div><hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_pool_create_info-members.html b/docs/html/struct_vma_pool_create_info-members.html index c8857c1..a77487e 100644 --- a/docs/html/struct_vma_pool_create_info-members.html +++ b/docs/html/struct_vma_pool_create_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,11 +73,14 @@ <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> - <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> + <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">minAllocationAlignment</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> + <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> + <tr><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">pMemoryAllocateNext</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> + <tr class="even"><td class="entry"><a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a></td><td class="entry"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td><td class="entry"></td></tr> </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_pool_create_info.html b/docs/html/struct_vma_pool_create_info.html index 82bb666..7e9bd44 100644 --- a/docs/html/struct_vma_pool_create_info.html +++ b/docs/html/struct_vma_pool_create_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaPoolCreateInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -94,6 +94,15 @@ <tr class="memitem:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a></td></tr> <tr class="memdesc:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame. <a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">More...</a><br /></td></tr> <tr class="separator:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a16e686c688f6725f119ebf6e24ab5274"><td class="memItemLeft" align="right" valign="top">float </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a></td></tr> +<tr class="memdesc:a16e686c688f6725f119ebf6e24ab5274"><td class="mdescLeft"> </td><td class="mdescRight">A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations. <a href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">More...</a><br /></td></tr> +<tr class="separator:a16e686c688f6725f119ebf6e24ab5274"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:ade3eca546f0c6ab4e8fbf20eb6d854cb"><td class="memItemLeft" align="right" valign="top">VkDeviceSize </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">minAllocationAlignment</a></td></tr> +<tr class="memdesc:ade3eca546f0c6ab4e8fbf20eb6d854cb"><td class="mdescLeft"> </td><td class="mdescRight">Additional minimum alignment to be used for all allocations created from this pool. Can be 0. <a href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">More...</a><br /></td></tr> +<tr class="separator:ade3eca546f0c6ab4e8fbf20eb6d854cb"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:af0f8c58f51a2a7a0a389dc79565044d7"><td class="memItemLeft" align="right" valign="top">void * </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">pMemoryAllocateNext</a></td></tr> +<tr class="memdesc:af0f8c58f51a2a7a0a389dc79565044d7"><td class="mdescLeft"> </td><td class="mdescRight">Additional <code>pNext</code> chain to be attached to <code>VkMemoryAllocateInfo</code> used for every allocation made by this pool. Optional. <a href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">More...</a><br /></td></tr> +<tr class="separator:af0f8c58f51a2a7a0a389dc79565044d7"><td class="memSeparator" colspan="2"> </td></tr> </table> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <div class="textblock"><p>Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool.">VmaPool</a>. </p> @@ -185,6 +194,23 @@ </div> </div> +<a id="ade3eca546f0c6ab4e8fbf20eb6d854cb"></a> +<h2 class="memtitle"><span class="permalink"><a href="#ade3eca546f0c6ab4e8fbf20eb6d854cb">◆ </a></span>minAllocationAlignment</h2> + +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">VkDeviceSize VmaPoolCreateInfo::minAllocationAlignment</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Additional minimum alignment to be used for all allocations created from this pool. Can be 0. </p> +<p>Leave 0 (default) not to impose any additional alignment. If not 0, it must be a power of two. It can be useful in cases where alignment returned by Vulkan by functions like <code>vkGetBufferMemoryRequirements</code> is not enough, e.g. when doing interop with OpenGL. </p> + +</div> +</div> <a id="ad8006fb803185c0a699d30f3e9a865ae"></a> <h2 class="memtitle"><span class="permalink"><a href="#ad8006fb803185c0a699d30f3e9a865ae">◆ </a></span>minBlockCount</h2> @@ -202,13 +228,48 @@ </div> </div> +<a id="af0f8c58f51a2a7a0a389dc79565044d7"></a> +<h2 class="memtitle"><span class="permalink"><a href="#af0f8c58f51a2a7a0a389dc79565044d7">◆ </a></span>pMemoryAllocateNext</h2> + +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">void* VmaPoolCreateInfo::pMemoryAllocateNext</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>Additional <code>pNext</code> chain to be attached to <code>VkMemoryAllocateInfo</code> used for every allocation made by this pool. Optional. </p> +<p>Optional, can be null. If not null, it must point to a <code>pNext</code> chain of structures that can be attached to <code>VkMemoryAllocateInfo</code>. It can be useful for special needs such as adding <code>VkExportMemoryAllocateInfoKHR</code>. Structures pointed by this member must remain alive and unchanged for the whole lifetime of the custom pool.</p> +<p>Please note that some structures, e.g. <code>VkMemoryPriorityAllocateInfoEXT</code>, <code>VkMemoryDedicatedAllocateInfoKHR</code>, can be attached automatically by this library when using other, more convenient of its features. </p> + +</div> +</div> +<a id="a16e686c688f6725f119ebf6e24ab5274"></a> +<h2 class="memtitle"><span class="permalink"><a href="#a16e686c688f6725f119ebf6e24ab5274">◆ </a></span>priority</h2> + +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">float VmaPoolCreateInfo::priority</td> + </tr> + </table> +</div><div class="memdoc"> + +<p>A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relative to other memory allocations. </p> +<p>It is used only when <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> flag was used during creation of the <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a> object. Otherwise, this variable is ignored. </p> + +</div> +</div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_pool_stats-members.html b/docs/html/struct_vma_pool_stats-members.html index 9784652..14d90f6 100644 --- a/docs/html/struct_vma_pool_stats-members.html +++ b/docs/html/struct_vma_pool_stats-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -77,7 +77,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_pool_stats.html b/docs/html/struct_vma_pool_stats.html index 4800979..1769912 100644 --- a/docs/html/struct_vma_pool_stats.html +++ b/docs/html/struct_vma_pool_stats.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaPoolStats Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -196,12 +196,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_record_settings-members.html b/docs/html/struct_vma_record_settings-members.html index 1ea7deb..c7eef40 100644 --- a/docs/html/struct_vma_record_settings-members.html +++ b/docs/html/struct_vma_record_settings-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -73,7 +73,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_record_settings.html b/docs/html/struct_vma_record_settings.html index ffd4aee..9ba37eb 100644 --- a/docs/html/struct_vma_record_settings.html +++ b/docs/html/struct_vma_record_settings.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaRecordSettings Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -120,12 +120,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_stat_info-members.html b/docs/html/struct_vma_stat_info-members.html index 440d9f9..332e116 100644 --- a/docs/html/struct_vma_stat_info-members.html +++ b/docs/html/struct_vma_stat_info-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -82,7 +82,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_stat_info.html b/docs/html/struct_vma_stat_info.html index 0c69723..61d63d9 100644 --- a/docs/html/struct_vma_stat_info.html +++ b/docs/html/struct_vma_stat_info.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaStatInfo Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -272,12 +272,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_stats-members.html b/docs/html/struct_vma_stats-members.html index 9c01bab..14ae84a 100644 --- a/docs/html/struct_vma_stats-members.html +++ b/docs/html/struct_vma_stats-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -74,7 +74,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_stats.html b/docs/html/struct_vma_stats.html index d1b05e9..6df74e3 100644 --- a/docs/html/struct_vma_stats.html +++ b/docs/html/struct_vma_stats.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaStats Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -129,12 +129,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_vulkan_functions-members.html b/docs/html/struct_vma_vulkan_functions-members.html index 49c6263..877721c 100644 --- a/docs/html/struct_vma_vulkan_functions-members.html +++ b/docs/html/struct_vma_vulkan_functions-members.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Member List</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -88,7 +88,7 @@ </table></div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/struct_vma_vulkan_functions.html b/docs/html/struct_vma_vulkan_functions.html index 8fc0f85..342de5a 100644 --- a/docs/html/struct_vma_vulkan_functions.html +++ b/docs/html/struct_vma_vulkan_functions.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: VmaVulkanFunctions Struct Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -354,12 +354,12 @@ </div> </div> <hr/>The documentation for this struct was generated from the following file:<ul> -<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> +<li>include/<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li> </ul> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/usage_patterns.html b/docs/html/usage_patterns.html index 44f6034..d57a74c 100644 --- a/docs/html/usage_patterns.html +++ b/docs/html/usage_patterns.html
@@ -3,7 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Vulkan Memory Allocator: Recommended usage patterns</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -114,7 +114,7 @@ </ol> <p>Which solution is the most efficient depends on your resource and especially on the GPU. It is best to measure it and then make the decision. Some general recommendations:</p> <ul> -<li>On integrated graphics use (2) or (3) to avoid unnecesary time and memory overhead related to using a second copy and making transfer.</li> +<li>On integrated graphics use (2) or (3) to avoid unnecessary time and memory overhead related to using a second copy and making transfer.</li> <li>For small resources (e.g. constant buffers) use (2). Discrete AMD cards have special 256 MiB pool of video memory that is directly mappable. Even if the resource ends up in system memory, its data may be cached on GPU after first fetch over PCIe bus.</li> <li>For larger resources (e.g. textures), decide between (1) and (2). You may want to differentiate NVIDIA and AMD, e.g. by looking for memory type that is both <code>DEVICE_LOCAL</code> and <code>HOST_VISIBLE</code>. When you find it, use (2), otherwise use (1).</li> </ul> @@ -130,7 +130,7 @@ </div><!-- PageDoc --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/vk__mem__alloc_8h.html b/docs/html/vk__mem__alloc_8h.html index 4f1df0b..f568ef9 100644 --- a/docs/html/vk__mem__alloc_8h.html +++ b/docs/html/vk__mem__alloc_8h.html
@@ -3,9 +3,9 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> -<title>Vulkan Memory Allocator: vk_mem_alloc.h File Reference</title> +<title>Vulkan Memory Allocator: include/vk_mem_alloc.h File Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -59,6 +59,10 @@ </iframe> </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li> </ul> +</div> </div><!-- top --> <div class="header"> <div class="summary"> @@ -141,6 +145,8 @@ <tr class="separator:a05decf1cf4ebf767beba7acca6c1ec3a"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a7f9d5e71b70dd1a137c303a8a8262c10"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10">VMA_BUFFER_DEVICE_ADDRESS</a>   0</td></tr> <tr class="separator:a7f9d5e71b70dd1a137c303a8a8262c10"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a81af8a3a87e34bbb493848143cde43e4"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4">VMA_MEMORY_PRIORITY</a>   0</td></tr> +<tr class="separator:a81af8a3a87e34bbb493848143cde43e4"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ae25f0d55fd91cb166f002b63244800e1"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">VMA_STATS_STRING_ENABLED</a>   1</td></tr> <tr class="separator:ae25f0d55fd91cb166f002b63244800e1"><td class="memSeparator" colspan="2"> </td></tr> </table><table class="memberdecls"> @@ -232,75 +238,76 @@ <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a> Enumerations</h2></td></tr> <tr class="memitem:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> { <br /> -  <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001, -<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002, -<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004, -<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008, -<br /> -  <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010, -<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020, -<a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF +  <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008 +, <br /> +  <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> = 0x00000040 +, <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF <br /> }</td></tr> <tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft"> </td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized.">VmaAllocator</a>. <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr> <tr class="separator:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memSeparator" colspan="2"> </td></tr> -<tr class="memitem:a4dd2c44642312a147a4e93373a6e64d2"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001, -<a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF +<tr class="memitem:a4dd2c44642312a147a4e93373a6e64d2"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001 +, <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF }</td></tr> <tr class="memdesc:a4dd2c44642312a147a4e93373a6e64d2"><td class="mdescLeft"> </td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum.">VmaRecordSettings::flags</a>. <a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">More...</a><br /></td></tr> <tr class="separator:a4dd2c44642312a147a4e93373a6e64d2"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:aa5846affa1e9da3800e3e78fae2305cc"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> { <br /> -  <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3, -<br /> -  <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6, -<a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF +  <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3 +, <br /> +  <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6 +, <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF <br /> }</td></tr> <tr class="separator:aa5846affa1e9da3800e3e78fae2305cc"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ad9889c10c798b040d59c92f257cae597"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> { <br /> -  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008, -<br /> -  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080, -<br /> -  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000, -<br /> -  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT, -<a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>, -<br /> +  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008 +, <br /> +  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080 +, <br /> +  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000 +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000 +, <br /> +  <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT +, <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> +, <br />   <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF <br /> }</td></tr> <tr class="memdesc:ad9889c10c798b040d59c92f257cae597"><td class="mdescLeft"> </td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum.">VmaAllocationCreateInfo::flags</a>. <a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">More...</a><br /></td></tr> <tr class="separator:ad9889c10c798b040d59c92f257cae597"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> { <br /> -  <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002, -<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004, -<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008, -<a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>, -<br /> +  <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002 +, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004 +, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008 +, <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> +, <br />   <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF <br /> }</td></tr> <tr class="memdesc:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="mdescLeft"> </td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446" title="Use combination of VmaPoolCreateFlagBits.">VmaPoolCreateInfo::flags</a>. <a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">More...</a><br /></td></tr> <tr class="separator:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="memSeparator" colspan="2"> </td></tr> -<tr class="memitem:a6552a65b71d16f378c6994b3ceaef50c"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1, -<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF +<tr class="memitem:a6552a65b71d16f378c6994b3ceaef50c"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1 +, <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF }</td></tr> <tr class="memdesc:a6552a65b71d16f378c6994b3ceaef50c"><td class="mdescLeft"> </td><td class="mdescRight">Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a>. None at the moment. Reserved for future use. <a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">More...</a><br /></td></tr> <tr class="separator:a6552a65b71d16f378c6994b3ceaef50c"><td class="memSeparator" colspan="2"> </td></tr> @@ -384,9 +391,6 @@ <tr class="memitem:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, size_t allocationCount, const <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations)</td></tr> <tr class="memdesc:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="mdescLeft"> </td><td class="mdescRight">Frees memory and destroys multiple allocations. <a href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">More...</a><br /></td></tr> <tr class="separator:a834b1e4aef395c0a1d56a28e69a4a17e"><td class="memSeparator" colspan="2"> </td></tr> -<tr class="memitem:a0ff488958ca72b28e545880463cb8696"><td class="memItemLeft" align="right" valign="top">VkResult </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize newSize)</td></tr> -<tr class="memdesc:a0ff488958ca72b28e545880463cb8696"><td class="mdescLeft"> </td><td class="mdescRight">Deprecated. <a href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">More...</a><br /></td></tr> -<tr class="separator:a0ff488958ca72b28e545880463cb8696"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr> <tr class="memdesc:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="mdescLeft"> </td><td class="mdescRight">Returns current information about specified allocation and atomically marks it as used in current frame. <a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">More...</a><br /></td></tr> <tr class="separator:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memSeparator" colspan="2"> </td></tr> @@ -514,6 +518,20 @@ </div> </div> +<a id="a81af8a3a87e34bbb493848143cde43e4"></a> +<h2 class="memtitle"><span class="permalink"><a href="#a81af8a3a87e34bbb493848143cde43e4">◆ </a></span>VMA_MEMORY_PRIORITY</h2> + +<div class="memitem"> +<div class="memproto"> + <table class="memname"> + <tr> + <td class="memname">#define VMA_MEMORY_PRIORITY   0</td> + </tr> + </table> +</div><div class="memdoc"> + +</div> +</div> <a id="a1f0c126759fc96ccb6e2d23c101d770c"></a> <h2 class="memtitle"><span class="permalink"><a href="#a1f0c126759fc96ccb6e2d23c101d770c">◆ </a></span>VMA_RECORDING_ENABLED</h2> @@ -770,7 +788,7 @@ </div><div class="memdoc"> <p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac" title="Deprecated. Compacts memory by moving allocations.">vmaDefragment()</a>. </p> -<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl> +<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead. </dd></dl> </div> </div> @@ -1112,7 +1130,7 @@ </td></tr> <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"></a>VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT </td><td class="fielddoc"><p>Enables usage of VK_KHR_dedicated_allocation extension. </p> <p>The flag works only if <a class="el" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285" title="Optional. The highest version of Vulkan that the application is designed to use.">VmaAllocatorCreateInfo::vulkanApiVersion</a> <code>== VK_API_VERSION_1_0</code>. When it's <code>VK_API_VERSION_1_1</code>, the flag is ignored because the extension has been promoted to Vulkan 1.1.</p> -<p>Using this extenion will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p> +<p>Using this extension will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p> <p>You may set this flag only if you found out that following device extensions are supported, you enabled them while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>, and you want them to be used internally by this library:</p> <ul> <li>VK_KHR_get_memory_requirements2 (device extension)</li> @@ -1151,6 +1169,11 @@ <p>When this flag is set, you can create buffers with <code>VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT</code> using VMA. The library automatically adds <code>VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT</code> to allocated memory blocks wherever it might be needed.</p> <p>For more information, see documentation chapter <a class="el" href="enabling_buffer_device_address.html">Enabling buffer device address</a>. </p> </td></tr> +<tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a"></a>VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT </td><td class="fielddoc"><p>Enables usage of VK_EXT_memory_priority extension in the library.</p> +<p>You may set this flag only if you found available and enabled this device extension, along with <code>VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority == VK_TRUE</code>, while creating Vulkan device passed as <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device.">VmaAllocatorCreateInfo::device</a>.</p> +<p>When this flag is used, <a class="el" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7" title="A floating-point value between 0 and 1, indicating the priority of the allocation relative to other m...">VmaAllocationCreateInfo::priority</a> and <a class="el" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274" title="A floating-point value between 0 and 1, indicating the priority of the allocations in this pool relat...">VmaPoolCreateInfo::priority</a> are used to set priorities of allocated Vulkan memory. Without it, these variables are ignored.</p> +<p>A priority must be a floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. Larger values are higher priority. The granularity of the priorities is implementation-dependent. It is automatically passed to every call to <code>vkAllocateMemory</code> done by the library using structure <code>VkMemoryPriorityAllocateInfoEXT</code>. The value to be used for default priority is 0.5. For more details, see the documentation of the VK_EXT_memory_priority extension. </p> +</td></tr> <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"></a>VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM </td><td class="fielddoc"></td></tr> </table> @@ -1628,7 +1651,7 @@ <p>Binds buffer to allocation with additional parameters. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> - <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginnig of the <code>allocation</code>. Normally it should be 0. </td></tr> + <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginning of the <code>allocation</code>. Normally it should be 0. </td></tr> <tr><td class="paramname">pNext</td><td>A chain of structures to be attached to <code>VkBindBufferMemoryInfoKHR</code> structure used internally. Normally it should be null.</td></tr> </table> </dd> @@ -1723,7 +1746,7 @@ <p>Binds image to allocation with additional parameters. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> - <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginnig of the <code>allocation</code>. Normally it should be 0. </td></tr> + <tr><td class="paramname">allocationLocalOffset</td><td>Additional offset to be added while binding, relative to the beginning of the <code>allocation</code>. Normally it should be 0. </td></tr> <tr><td class="paramname">pNext</td><td>A chain of structures to be attached to <code>VkBindImageMemoryInfoKHR</code> structure used internally. Normally it should be null.</td></tr> </table> </dd> @@ -1984,7 +2007,8 @@ </ol> <p>If any of these operations fail, buffer and allocation are not created, returned value is negative error code, *pBuffer and *pAllocation are null.</p> <p>If the function succeeded, you must destroy both buffer and allocation when you no longer need them using either convenience function <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77" title="Destroys Vulkan buffer and frees allocated memory.">vmaDestroyBuffer()</a> or separately, using <code>vkDestroyBuffer()</code> and <a class="el" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f" title="Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...">vmaFreeMemory()</a>.</p> -<p>If VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag was used, VK_KHR_dedicated_allocation extension is used internally to query driver whether it requires or prefers the new buffer to have dedicated allocation. If yes, and if dedicated allocation is possible (<a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> is null and VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT is not used), it creates dedicated allocation for this buffer, just like when using VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT. </p> +<p>If <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878" title="Enables usage of VK_KHR_dedicated_allocation extension.">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> flag was used, VK_KHR_dedicated_allocation extension is used internally to query driver whether it requires or prefers the new buffer to have dedicated allocation. If yes, and if dedicated allocation is possible (<a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in.">VmaAllocationCreateInfo::pool</a> is null and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff" title="Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> is not used), it creates dedicated allocation for this buffer, just like when using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block.">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>.</p> +<dl class="section note"><dt>Note</dt><dd>This function creates a new <code>VkBuffer</code>. Sub-allocation of parts of one large buffer, although recommended as a good practice, is out of scope of this library and could be implemented by the user as a higher-level logic on top of VMA. </dd></dl> </div> </div> @@ -2181,7 +2205,7 @@ </dd> </dl> <dl class="section return"><dt>Returns</dt><dd><code>VK_SUCCESS</code> if completed, negative error code in case of error.</dd></dl> -<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd></dl> +<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation.">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process.">vmaDefragmentationBegin()</a> instead.</dd></dl> <p>This function works by moving allocations to different places (different <code>VkDeviceMemory</code> objects and/or different offsets) in order to optimize memory usage. Only allocations that are in <code>pAllocations</code> array can be moved. All other allocations are considered nonmovable in this call. Basic rules:</p> <ul> <li>Only allocations made in memory types that have <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> and <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flags can be compacted. You may pass other allocations but it makes no sense - these will never be moved.</li> @@ -2344,6 +2368,7 @@ <p>This is just a convenience function equivalent to:</p> <div class="fragment"><div class="line">vkDestroyBuffer(device, buffer, allocationCallbacks);</div> <div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(allocator, allocation);</div> +<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div> </div><!-- fragment --><p>It it safe to pass null as buffer and/or allocation. </p> </div> @@ -3280,7 +3305,7 @@ </div><div class="memdoc"> <p>Maps memory represented by given allocation and returns pointer to it. </p> -<p>Maps memory represented by given allocation to make it accessible to CPU code. When succeeded, <code>*ppData</code> contains pointer to first byte of this memory. If the allocation is part of bigger <code>VkDeviceMemory</code> block, the pointer is correctly offseted to the beginning of region assigned to this particular allocation.</p> +<p>Maps memory represented by given allocation to make it accessible to CPU code. When succeeded, <code>*ppData</code> contains pointer to first byte of this memory. If the allocation is part of bigger <code>VkDeviceMemory</code> block, the pointer is correctly offsetted to the beginning of region assigned to this particular allocation.</p> <p>Mapping is internally reference-counted and synchronized, so despite raw Vulkan function <code>vkMapMemory()</code> cannot be used to map same block of <code>VkDeviceMemory</code> multiple times simultaneously, it is safe to call this function on allocations assigned to the same memory block. Actual Vulkan memory will be mapped on first mapping and unmapped on last unmapping.</p> <p>If the function succeeded, you must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> to unmap the allocation when mapping is no longer needed or before freeing the allocation, at the latest.</p> <p>It also safe to call this function multiple times on the same allocation. You must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory().">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it.">vmaMapMemory()</a>.</p> @@ -3291,43 +3316,6 @@ </div> </div> -<a id="a0ff488958ca72b28e545880463cb8696"></a> -<h2 class="memtitle"><span class="permalink"><a href="#a0ff488958ca72b28e545880463cb8696">◆ </a></span>vmaResizeAllocation()</h2> - -<div class="memitem"> -<div class="memproto"> - <table class="memname"> - <tr> - <td class="memname">VkResult vmaResizeAllocation </td> - <td>(</td> - <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a> </td> - <td class="paramname"><em>allocator</em>, </td> - </tr> - <tr> - <td class="paramkey"></td> - <td></td> - <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> </td> - <td class="paramname"><em>allocation</em>, </td> - </tr> - <tr> - <td class="paramkey"></td> - <td></td> - <td class="paramtype">VkDeviceSize </td> - <td class="paramname"><em>newSize</em> </td> - </tr> - <tr> - <td></td> - <td>)</td> - <td></td><td></td> - </tr> - </table> -</div><div class="memdoc"> - -<p>Deprecated. </p> -<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>In version 2.2.0 it used to try to change allocation's size without moving or reallocating it. In current version it returns <code>VK_SUCCESS</code> only if <code>newSize</code> equals current allocation's size. Otherwise returns <code>VK_ERROR_OUT_OF_POOL_MEMORY</code>, indicating that allocation's size could not be changed. </dd></dl> - -</div> -</div> <a id="af9147d31ffc11d62fc187bde283ed14f"></a> <h2 class="memtitle"><span class="permalink"><a href="#af9147d31ffc11d62fc187bde283ed14f">◆ </a></span>vmaSetAllocationUserData()</h2> @@ -3500,10 +3488,9 @@ </div> </div> </div><!-- contents --> -<div class="ttc" id="avk__mem__alloc_8h_html_a5fea5518972ae9094b1526cbcb19b05f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, const VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(),...</div></div> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> -Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20 +Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </small></address> </body> </html>
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html index cb1de29..8805ae7 100644 --- a/docs/html/vk__mem__alloc_8h_source.html +++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -3,9 +3,9 @@ <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen 1.8.20"/> +<meta name="generator" content="Doxygen 1.9.1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> -<title>Vulkan Memory Allocator: vk_mem_alloc.h Source File</title> +<title>Vulkan Memory Allocator: include/vk_mem_alloc.h Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> @@ -29,10 +29,10 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.20 --> +<!-- Generated by Doxygen 1.9.1 --> <script type="text/javascript"> /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ -var searchBox = new SearchBox("searchBox", "search",false,'Search'); +var searchBox = new SearchBox("searchBox", "search",false,'Search','.html'); /* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> @@ -45,7 +45,6 @@ }); /* @license-end */</script> <div id="main-nav"></div> -</div><!-- top --> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" @@ -60,13 +59,18 @@ </iframe> </div> +<div id="nav-path" class="navpath"> + <ul> +<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li> </ul> +</div> +</div><!-- top --> <div class="header"> <div class="headertitle"> <div class="title">vk_mem_alloc.h</div> </div> </div><!--header--> <div class="contents"> <a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//</span></div> -<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// Copyright (c) 2017-2020 Advanced Micro Devices, Inc. All rights reserved.</span></div> +<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All rights reserved.</span></div> <div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">//</span></div> <div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div> <div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// of this software and associated documentation files (the "Software"), to deal</span></div> @@ -90,7310 +94,7241 @@ <div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div> <div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div> <div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  </div> -<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span> <span class="preprocessor">#ifdef __cplusplus</span></div> -<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div> -<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  </div> -<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span> <span class="comment">/*</span></div> -<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span> <span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div> -<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span> <span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div> -<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span> <span class="comment">*/</span></div> -<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span> <span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l02012"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 2012</a></span> <span class="preprocessor"> #define VMA_RECORDING_ENABLED 0</span></div> -<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  </div> -<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span> <span class="preprocessor">#if !defined(NOMINMAX) && defined(VMA_IMPLEMENTATION)</span></div> -<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span> <span class="preprocessor"> #define NOMINMAX // For windows.h</span></div> -<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  </div> -<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span> <span class="preprocessor">#if defined(__ANDROID__) && defined(VK_NO_PROTOTYPES) && VMA_STATIC_VULKAN_FUNCTIONS</span></div> -<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div> -<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div> -<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;</div> -<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;</div> -<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  <span class="keyword">extern</span> PFN_vkAllocateMemory vkAllocateMemory;</div> -<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="keyword">extern</span> PFN_vkFreeMemory vkFreeMemory;</div> -<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="keyword">extern</span> PFN_vkMapMemory vkMapMemory;</div> -<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="keyword">extern</span> PFN_vkUnmapMemory vkUnmapMemory;</div> -<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keyword">extern</span> PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;</div> -<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  <span class="keyword">extern</span> PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;</div> -<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  <span class="keyword">extern</span> PFN_vkBindBufferMemory vkBindBufferMemory;</div> -<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  <span class="keyword">extern</span> PFN_vkBindImageMemory vkBindImageMemory;</div> -<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;</div> -<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;</div> -<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keyword">extern</span> PFN_vkCreateBuffer vkCreateBuffer;</div> -<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  <span class="keyword">extern</span> PFN_vkDestroyBuffer vkDestroyBuffer;</div> -<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <span class="keyword">extern</span> PFN_vkCreateImage vkCreateImage;</div> -<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="keyword">extern</span> PFN_vkDestroyImage vkDestroyImage;</div> -<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="keyword">extern</span> PFN_vkCmdCopyBuffer vkCmdCopyBuffer;</div> -<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span> <span class="preprocessor"> #if VMA_VULKAN_VERSION >= 1001000</span></div> -<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;</div> -<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;</div> -<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <span class="keyword">extern</span> PFN_vkBindBufferMemory2 vkBindBufferMemory2;</div> -<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="keyword">extern</span> PFN_vkBindImageMemory2 vkBindImageMemory2;</div> -<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;</div> -<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span> <span class="preprocessor"> #endif // #if VMA_VULKAN_VERSION >= 1001000</span></div> -<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> <span class="preprocessor">#endif // #if defined(__ANDROID__) && VMA_STATIC_VULKAN_FUNCTIONS && VK_NO_PROTOTYPES</span></div> -<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  </div> -<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span> <span class="preprocessor">#ifndef VULKAN_H_</span></div> -<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span> <span class="preprocessor"> #include <vulkan/vulkan.h></span></div> -<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  </div> -<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span> <span class="comment">// Define this macro to declare maximum supported Vulkan version in format AAABBBCCC,</span></div> -<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span> <span class="comment">// where AAA = major, BBB = minor, CCC = patch.</span></div> -<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span> <span class="comment">// If you want to use version > 1.0, it still needs to be enabled via VmaAllocatorCreateInfo::vulkanApiVersion.</span></div> -<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span> <span class="preprocessor">#if !defined(VMA_VULKAN_VERSION)</span></div> -<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span> <span class="preprocessor"> #if defined(VK_VERSION_1_2)</span></div> -<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1002000</span></div> -<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span> <span class="preprocessor"> #elif defined(VK_VERSION_1_1)</span></div> -<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1001000</span></div> -<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02061"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6"> 2061</a></span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1000000</span></div> -<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span> <span class="preprocessor">#ifdef __cplusplus</span></div> +<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div> +<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  </div> +<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span> <span class="comment">/*</span></div> +<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> <span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div> +<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span> <span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div> +<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span> <span class="comment">*/</span></div> +<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span> <span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l02029"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 2029</a></span> <span class="preprocessor"> #define VMA_RECORDING_ENABLED 0</span></div> +<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  </div> +<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span> <span class="preprocessor">#if !defined(NOMINMAX) && defined(VMA_IMPLEMENTATION)</span></div> +<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span> <span class="preprocessor"> #define NOMINMAX </span><span class="comment">// For windows.h</span></div> +<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  </div> +<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span> <span class="preprocessor">#if defined(__ANDROID__) && defined(VK_NO_PROTOTYPES) && VMA_STATIC_VULKAN_FUNCTIONS</span></div> +<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div> +<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div> +<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;</div> +<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;</div> +<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <span class="keyword">extern</span> PFN_vkAllocateMemory vkAllocateMemory;</div> +<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <span class="keyword">extern</span> PFN_vkFreeMemory vkFreeMemory;</div> +<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="keyword">extern</span> PFN_vkMapMemory vkMapMemory;</div> +<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keyword">extern</span> PFN_vkUnmapMemory vkUnmapMemory;</div> +<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  <span class="keyword">extern</span> PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;</div> +<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  <span class="keyword">extern</span> PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;</div> +<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <span class="keyword">extern</span> PFN_vkBindBufferMemory vkBindBufferMemory;</div> +<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keyword">extern</span> PFN_vkBindImageMemory vkBindImageMemory;</div> +<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;</div> +<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;</div> +<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  <span class="keyword">extern</span> PFN_vkCreateBuffer vkCreateBuffer;</div> +<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  <span class="keyword">extern</span> PFN_vkDestroyBuffer vkDestroyBuffer;</div> +<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="keyword">extern</span> PFN_vkCreateImage vkCreateImage;</div> +<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keyword">extern</span> PFN_vkDestroyImage vkDestroyImage;</div> +<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  <span class="keyword">extern</span> PFN_vkCmdCopyBuffer vkCmdCopyBuffer;</div> +<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span> <span class="preprocessor"> #if VMA_VULKAN_VERSION >= 1001000</span></div> +<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  <span class="keyword">extern</span> PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;</div> +<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="keyword">extern</span> PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;</div> +<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keyword">extern</span> PFN_vkBindBufferMemory2 vkBindBufferMemory2;</div> +<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <span class="keyword">extern</span> PFN_vkBindImageMemory2 vkBindImageMemory2;</div> +<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  <span class="keyword">extern</span> PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;</div> +<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> <span class="preprocessor"> #endif </span><span class="comment">// #if VMA_VULKAN_VERSION >= 1001000</span></div> +<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span> <span class="preprocessor">#endif </span><span class="comment">// #if defined(__ANDROID__) && VMA_STATIC_VULKAN_FUNCTIONS && VK_NO_PROTOTYPES</span></div> <div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  </div> -<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span> <span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div> -<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span> <span class="preprocessor"> #if VK_KHR_get_memory_requirements2 && VK_KHR_dedicated_allocation</span></div> -<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span> <span class="preprocessor"> #define VMA_DEDICATED_ALLOCATION 1</span></div> -<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02069"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 2069</a></span> <span class="preprocessor"> #define VMA_DEDICATED_ALLOCATION 0</span></div> -<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  </div> -<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> <span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div> -<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span> <span class="preprocessor"> #if VK_KHR_bind_memory2</span></div> -<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> <span class="preprocessor"> #define VMA_BIND_MEMORY2 1</span></div> -<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02077"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 2077</a></span> <span class="preprocessor"> #define VMA_BIND_MEMORY2 0</span></div> -<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  </div> -<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span> <span class="preprocessor">#if !defined(VMA_MEMORY_BUDGET)</span></div> -<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span> <span class="preprocessor"> #if VK_EXT_memory_budget && (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION >= 1001000)</span></div> -<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span> <span class="preprocessor"> #define VMA_MEMORY_BUDGET 1</span></div> -<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02085"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a"> 2085</a></span> <span class="preprocessor"> #define VMA_MEMORY_BUDGET 0</span></div> -<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  </div> -<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span> <span class="comment">// Defined to 1 when VK_KHR_buffer_device_address device extension or equivalent core Vulkan 1.2 feature is defined in its headers.</span></div> -<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span> <span class="preprocessor">#if !defined(VMA_BUFFER_DEVICE_ADDRESS)</span></div> -<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span> <span class="preprocessor"> #if VK_KHR_buffer_device_address || VMA_VULKAN_VERSION >= 1002000</span></div> -<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span> <span class="preprocessor"> #define VMA_BUFFER_DEVICE_ADDRESS 1</span></div> +<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span> <span class="preprocessor">#ifndef VULKAN_H_</span></div> +<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span> <span class="preprocessor"> #include <vulkan/vulkan.h></span></div> +<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  </div> +<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span> <span class="comment">// Define this macro to declare maximum supported Vulkan version in format AAABBBCCC,</span></div> +<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span> <span class="comment">// where AAA = major, BBB = minor, CCC = patch.</span></div> +<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> <span class="comment">// If you want to use version > 1.0, it still needs to be enabled via VmaAllocatorCreateInfo::vulkanApiVersion.</span></div> +<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span> <span class="preprocessor">#if !defined(VMA_VULKAN_VERSION)</span></div> +<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> <span class="preprocessor"> #if defined(VK_VERSION_1_2)</span></div> +<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1002000</span></div> +<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span> <span class="preprocessor"> #elif defined(VK_VERSION_1_1)</span></div> +<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1001000</span></div> +<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02078"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1a2407c283893638cc039bb31fcd74b6"> 2078</a></span> <span class="preprocessor"> #define VMA_VULKAN_VERSION 1000000</span></div> +<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  </div> +<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span> <span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div> +<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span> <span class="preprocessor"> #if VK_KHR_get_memory_requirements2 && VK_KHR_dedicated_allocation</span></div> +<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span> <span class="preprocessor"> #define VMA_DEDICATED_ALLOCATION 1</span></div> +<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02086"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 2086</a></span> <span class="preprocessor"> #define VMA_DEDICATED_ALLOCATION 0</span></div> +<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  </div> +<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span> <span class="preprocessor">#if !defined(VMA_BIND_MEMORY2)</span></div> +<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span> <span class="preprocessor"> #if VK_KHR_bind_memory2</span></div> +<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span> <span class="preprocessor"> #define VMA_BIND_MEMORY2 1</span></div> <div class="line"><a name="l02093"></a><span class="lineno"> 2093</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02094"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10"> 2094</a></span> <span class="preprocessor"> #define VMA_BUFFER_DEVICE_ADDRESS 0</span></div> +<div class="line"><a name="l02094"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88bef97f86d70a34a4c0746e09a2680d"> 2094</a></span> <span class="preprocessor"> #define VMA_BIND_MEMORY2 0</span></div> <div class="line"><a name="l02095"></a><span class="lineno"> 2095</span> <span class="preprocessor"> #endif</span></div> <div class="line"><a name="l02096"></a><span class="lineno"> 2096</span> <span class="preprocessor">#endif</span></div> <div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  </div> -<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span> <span class="comment">// Define these macros to decorate all public functions with additional code,</span></div> -<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span> <span class="comment">// before and after returned type, appropriately. This may be useful for</span></div> -<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> <span class="comment">// exporting the functions when compiling VMA as a separate library. Example:</span></div> -<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> <span class="comment">// #define VMA_CALL_PRE __declspec(dllexport)</span></div> -<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span> <span class="comment">// #define VMA_CALL_POST __cdecl</span></div> -<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span> <span class="preprocessor">#ifndef VMA_CALL_PRE</span></div> -<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span> <span class="preprocessor"> #define VMA_CALL_PRE</span></div> -<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> <span class="preprocessor">#ifndef VMA_CALL_POST</span></div> -<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span> <span class="preprocessor"> #define VMA_CALL_POST</span></div> -<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  </div> -<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span> <span class="comment">// Define this macro to decorate pointers with an attribute specifying the</span></div> -<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span> <span class="comment">// length of the array they point to if they are not null.</span></div> -<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span> <span class="comment">//</span></div> -<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> <span class="comment">// The length may be one of</span></div> -<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span> <span class="comment">// - The name of another parameter in the argument list where the pointer is declared</span></div> -<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> <span class="comment">// - The name of another member in the struct where the pointer is declared</span></div> -<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span> <span class="comment">// - The name of a member of a struct type, meaning the value of that member in</span></div> -<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span> <span class="comment">// the context of the call. For example</span></div> -<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> <span class="comment">// VMA_LEN_IF_NOT_NULL("VkPhysicalDeviceMemoryProperties::memoryHeapCount"),</span></div> -<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span> <span class="comment">// this means the number of memory heaps available in the device associated</span></div> -<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span> <span class="comment">// with the VmaAllocator being dealt with.</span></div> -<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> <span class="preprocessor">#ifndef VMA_LEN_IF_NOT_NULL</span></div> -<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> <span class="preprocessor"> #define VMA_LEN_IF_NOT_NULL(len)</span></div> -<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  </div> -<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span> <span class="comment">// The VMA_NULLABLE macro is defined to be _Nullable when compiling with Clang.</span></div> -<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> <span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nullable</span></div> -<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span> <span class="preprocessor">#ifndef VMA_NULLABLE</span></div> -<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span> <span class="preprocessor"> #ifdef __clang__</span></div> -<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> <span class="preprocessor"> #define VMA_NULLABLE _Nullable</span></div> -<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span> <span class="preprocessor"> #define VMA_NULLABLE</span></div> -<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  </div> -<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span> <span class="comment">// The VMA_NOT_NULL macro is defined to be _Nonnull when compiling with Clang.</span></div> -<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span> <span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nonnull</span></div> -<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span> <span class="preprocessor">#ifndef VMA_NOT_NULL</span></div> -<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> <span class="preprocessor"> #ifdef __clang__</span></div> -<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span> <span class="preprocessor"> #define VMA_NOT_NULL _Nonnull</span></div> -<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span> <span class="preprocessor"> #define VMA_NOT_NULL</span></div> -<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  </div> -<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span> <span class="comment">// If non-dispatchable handles are represented as pointers then we can give</span></div> -<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span> <span class="comment">// then nullability annotations</span></div> -<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span> <span class="preprocessor">#ifndef VMA_NOT_NULL_NON_DISPATCHABLE</span></div> -<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> <span class="preprocessor"> #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div> -<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> <span class="preprocessor"> #define VMA_NOT_NULL_NON_DISPATCHABLE VMA_NOT_NULL</span></div> -<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> <span class="preprocessor"> #define VMA_NOT_NULL_NON_DISPATCHABLE</span></div> -<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  </div> -<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> <span class="preprocessor">#ifndef VMA_NULLABLE_NON_DISPATCHABLE</span></div> -<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> <span class="preprocessor"> #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div> -<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> <span class="preprocessor"> #define VMA_NULLABLE_NON_DISPATCHABLE VMA_NULLABLE</span></div> -<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> <span class="preprocessor"> #define VMA_NULLABLE_NON_DISPATCHABLE</span></div> -<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  </div> -<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div> -<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  </div> -<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span> <span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div> -<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  uint32_t memoryType,</div> -<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div> -<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  VkDeviceSize size,</div> -<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> -<div class="line"><a name="l02182"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b"> 2182</a></span> <span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a>)(</div> -<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  uint32_t memoryType,</div> -<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div> -<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  VkDeviceSize size,</div> -<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> +<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span> <span class="preprocessor">#if !defined(VMA_MEMORY_BUDGET)</span></div> +<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span> <span class="preprocessor"> #if VK_EXT_memory_budget && (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION >= 1001000)</span></div> +<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> <span class="preprocessor"> #define VMA_MEMORY_BUDGET 1</span></div> +<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02102"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a05decf1cf4ebf767beba7acca6c1ec3a"> 2102</a></span> <span class="preprocessor"> #define VMA_MEMORY_BUDGET 0</span></div> +<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  </div> +<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> <span class="comment">// Defined to 1 when VK_KHR_buffer_device_address device extension or equivalent core Vulkan 1.2 feature is defined in its headers.</span></div> +<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span> <span class="preprocessor">#if !defined(VMA_BUFFER_DEVICE_ADDRESS)</span></div> +<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span> <span class="preprocessor"> #if VK_KHR_buffer_device_address || VMA_VULKAN_VERSION >= 1002000</span></div> +<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span> <span class="preprocessor"> #define VMA_BUFFER_DEVICE_ADDRESS 1</span></div> +<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02111"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7f9d5e71b70dd1a137c303a8a8262c10"> 2111</a></span> <span class="preprocessor"> #define VMA_BUFFER_DEVICE_ADDRESS 0</span></div> +<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  </div> +<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> <span class="comment">// Defined to 1 when VK_EXT_memory_priority device extension is defined in Vulkan headers.</span></div> +<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span> <span class="preprocessor">#if !defined(VMA_MEMORY_PRIORITY)</span></div> +<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span> <span class="preprocessor"> #if VK_EXT_memory_priority</span></div> +<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> <span class="preprocessor"> #define VMA_MEMORY_PRIORITY 1</span></div> +<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02120"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a81af8a3a87e34bbb493848143cde43e4"> 2120</a></span> <span class="preprocessor"> #define VMA_MEMORY_PRIORITY 0</span></div> +<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  </div> +<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span> <span class="comment">// Define these macros to decorate all public functions with additional code,</span></div> +<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span> <span class="comment">// before and after returned type, appropriately. This may be useful for</span></div> +<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> <span class="comment">// exporting the functions when compiling VMA as a separate library. Example:</span></div> +<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span> <span class="comment">// #define VMA_CALL_PRE __declspec(dllexport)</span></div> +<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span> <span class="comment">// #define VMA_CALL_POST __cdecl</span></div> +<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span> <span class="preprocessor">#ifndef VMA_CALL_PRE</span></div> +<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> <span class="preprocessor"> #define VMA_CALL_PRE</span></div> +<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span> <span class="preprocessor">#ifndef VMA_CALL_POST</span></div> +<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span> <span class="preprocessor"> #define VMA_CALL_POST</span></div> +<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  </div> +<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span> <span class="comment">// Define this macro to decorate pointers with an attribute specifying the</span></div> +<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span> <span class="comment">// length of the array they point to if they are not null.</span></div> +<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span> <span class="comment">//</span></div> +<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span> <span class="comment">// The length may be one of</span></div> +<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span> <span class="comment">// - The name of another parameter in the argument list where the pointer is declared</span></div> +<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span> <span class="comment">// - The name of another member in the struct where the pointer is declared</span></div> +<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span> <span class="comment">// - The name of a member of a struct type, meaning the value of that member in</span></div> +<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span> <span class="comment">// the context of the call. For example</span></div> +<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span> <span class="comment">// VMA_LEN_IF_NOT_NULL("VkPhysicalDeviceMemoryProperties::memoryHeapCount"),</span></div> +<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span> <span class="comment">// this means the number of memory heaps available in the device associated</span></div> +<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span> <span class="comment">// with the VmaAllocator being dealt with.</span></div> +<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span> <span class="preprocessor">#ifndef VMA_LEN_IF_NOT_NULL</span></div> +<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> <span class="preprocessor"> #define VMA_LEN_IF_NOT_NULL(len)</span></div> +<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  </div> +<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> <span class="comment">// The VMA_NULLABLE macro is defined to be _Nullable when compiling with Clang.</span></div> +<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span> <span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nullable</span></div> +<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> <span class="preprocessor">#ifndef VMA_NULLABLE</span></div> +<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span> <span class="preprocessor"> #ifdef __clang__</span></div> +<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span> <span class="preprocessor"> #define VMA_NULLABLE _Nullable</span></div> +<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> <span class="preprocessor"> #define VMA_NULLABLE</span></div> +<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  </div> +<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span> <span class="comment">// The VMA_NOT_NULL macro is defined to be _Nonnull when compiling with Clang.</span></div> +<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span> <span class="comment">// see: https://clang.llvm.org/docs/AttributeReference.html#nonnull</span></div> +<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span> <span class="preprocessor">#ifndef VMA_NOT_NULL</span></div> +<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> <span class="preprocessor"> #ifdef __clang__</span></div> +<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span> <span class="preprocessor"> #define VMA_NOT_NULL _Nonnull</span></div> +<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span> <span class="preprocessor"> #define VMA_NOT_NULL</span></div> +<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  </div> +<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span> <span class="comment">// If non-dispatchable handles are represented as pointers then we can give</span></div> +<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span> <span class="comment">// then nullability annotations</span></div> +<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span> <span class="preprocessor">#ifndef VMA_NOT_NULL_NON_DISPATCHABLE</span></div> +<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span> <span class="preprocessor"> #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div> +<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span> <span class="preprocessor"> #define VMA_NOT_NULL_NON_DISPATCHABLE VMA_NOT_NULL</span></div> +<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span> <span class="preprocessor"> #define VMA_NOT_NULL_NON_DISPATCHABLE</span></div> +<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  </div> +<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span> <span class="preprocessor">#ifndef VMA_NULLABLE_NON_DISPATCHABLE</span></div> +<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span> <span class="preprocessor"> #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)</span></div> +<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span> <span class="preprocessor"> #define VMA_NULLABLE_NON_DISPATCHABLE VMA_NULLABLE</span></div> +<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span> <span class="preprocessor"> #define VMA_NULLABLE_NON_DISPATCHABLE</span></div> +<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span> <span class="preprocessor">#endif</span></div> <div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  </div> -<div class="line"><a name="l02196"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 2196</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div> -<div class="line"><a name="l02198"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 2198</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div> -<div class="line"><a name="l02200"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 2200</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div> -<div class="line"><a name="l02202"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6"> 2202</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div> -<div class="line"><a name="l02203"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b"> 2203</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a>;</div> -<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  </div> -<div class="line"><a name="l02206"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 2206</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div> -<div class="line"><a name="l02211"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 2211</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div> -<div class="line"><a name="l02236"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 2236</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div> -<div class="line"><a name="l02251"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 2251</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div> -<div class="line"><a name="l02263"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"> 2263</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008,</div> -<div class="line"><a name="l02281"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"> 2281</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010,</div> -<div class="line"><a name="l02299"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"> 2299</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020,</div> -<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  </div> -<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l02302"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afd73b95e737ee7e76f827cb5472f559f"> 2302</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div> -<div class="line"><a name="l02303"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 2303</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div> -<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  </div> -<div class="line"><a name="l02309"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 2309</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div> -<div class="line"><a name="l02310"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 2310</a></span>  PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div> -<div class="line"><a name="l02311"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 2311</a></span>  PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div> -<div class="line"><a name="l02312"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 2312</a></span>  PFN_vkAllocateMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div> -<div class="line"><a name="l02313"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 2313</a></span>  PFN_vkFreeMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div> -<div class="line"><a name="l02314"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 2314</a></span>  PFN_vkMapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div> -<div class="line"><a name="l02315"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 2315</a></span>  PFN_vkUnmapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div> -<div class="line"><a name="l02316"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 2316</a></span>  PFN_vkFlushMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div> -<div class="line"><a name="l02317"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 2317</a></span>  PFN_vkInvalidateMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div> -<div class="line"><a name="l02318"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 2318</a></span>  PFN_vkBindBufferMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div> -<div class="line"><a name="l02319"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 2319</a></span>  PFN_vkBindImageMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div> -<div class="line"><a name="l02320"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 2320</a></span>  PFN_vkGetBufferMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div> -<div class="line"><a name="l02321"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 2321</a></span>  PFN_vkGetImageMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div> -<div class="line"><a name="l02322"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 2322</a></span>  PFN_vkCreateBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div> -<div class="line"><a name="l02323"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 2323</a></span>  PFN_vkDestroyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div> -<div class="line"><a name="l02324"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 2324</a></span>  PFN_vkCreateImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div> -<div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 2325</a></span>  PFN_vkDestroyImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div> -<div class="line"><a name="l02326"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 2326</a></span>  PFN_vkCmdCopyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div> -<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div> -<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  PFN_vkGetBufferMemoryRequirements2KHR VMA_NULLABLE vkGetBufferMemoryRequirements2KHR;</div> -<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  PFN_vkGetImageMemoryRequirements2KHR VMA_NULLABLE vkGetImageMemoryRequirements2KHR;</div> -<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div> -<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  PFN_vkBindBufferMemory2KHR VMA_NULLABLE vkBindBufferMemory2KHR;</div> -<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  PFN_vkBindImageMemory2KHR VMA_NULLABLE vkBindImageMemory2KHR;</div> -<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000</span></div> -<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  PFN_vkGetPhysicalDeviceMemoryProperties2KHR VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties2KHR;</div> -<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02338"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074"> 2338</a></span> } <a class="code" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a>;</div> -<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  </div> -<div class="line"><a name="l02341"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 2341</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div> -<div class="line"><a name="l02347"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 2347</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div> -<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  </div> -<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l02350"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acd24d5eb58abff7e1f43cb32a1ba1413"> 2350</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div> -<div class="line"><a name="l02351"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 2351</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div> -<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  </div> -<div class="line"><a name="l02354"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 2354</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div> -<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span> {</div> -<div class="line"><a name="l02357"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 2357</a></span>  <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div> -<div class="line"><a name="l02365"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 2365</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NOT_NULL <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div> -<div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc"> 2366</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a>;</div> -<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>  </div> -<div class="line"><a name="l02369"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 2369</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div> -<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> {</div> -<div class="line"><a name="l02372"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 2372</a></span>  <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div> -<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  </div> -<div class="line"><a name="l02375"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 2375</a></span>  VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div> -<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  </div> -<div class="line"><a name="l02378"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 2378</a></span>  VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div> -<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  </div> -<div class="line"><a name="l02381"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 2381</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div> -<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  </div> -<div class="line"><a name="l02384"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 2384</a></span>  <span class="keyword">const</span> VkAllocationCallbacks* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div> -<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>  </div> -<div class="line"><a name="l02387"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 2387</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div> -<div class="line"><a name="l02401"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 2401</a></span>  uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div> -<div class="line"><a name="l02426"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 2426</a></span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(<span class="stringliteral">"VkPhysicalDeviceMemoryProperties::memoryHeapCount"</span>) <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div> -<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  </div> -<div class="line"><a name="l02432"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 2432</a></span>  const <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div> -<div class="line"><a name="l02439"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 2439</a></span>  const <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div> -<div class="line"><a name="l02444"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b"> 2444</a></span>  VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>;</div> -<div class="line"><a name="l02453"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285"> 2453</a></span>  uint32_t <a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>;</div> -<div class="line"><a name="l02454"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a"> 2454</a></span> } <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>;</div> -<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  </div> -<div class="line"><a name="l02457"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb"> 2457</a></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="l02458"></a><span class="lineno"> 2458</span>  const <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> -<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE * VMA_NOT_NULL pAllocator);</div> -<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  </div> -<div class="line"><a name="l02462"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d"> 2462</a></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="l02463"></a><span class="lineno"> 2463</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE allocator);</div> -<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  </div> -<div class="line"><a name="l02467"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html"> 2467</a></span> typedef struct <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div> -<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> {</div> -<div class="line"><a name="l02473"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe"> 2473</a></span>  VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a>;</div> -<div class="line"><a name="l02478"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a"> 2478</a></span>  VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a>;</div> -<div class="line"><a name="l02483"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357"> 2483</a></span>  VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a>;</div> -<div class="line"><a name="l02484"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c"> 2484</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a>;</div> -<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  </div> -<div class="line"><a name="l02491"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7"> 2491</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* VMA_NOT_NULL pAllocatorInfo);</div> -<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  </div> -<div class="line"><a name="l02497"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0"> 2497</a></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="l02498"></a><span class="lineno"> 2498</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceProperties);</div> -<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  </div> -<div class="line"><a name="l02505"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19"> 2505</a></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="l02506"></a><span class="lineno"> 2506</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceMemoryProperties);</div> -<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  </div> -<div class="line"><a name="l02515"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca"> 2515</a></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="l02516"></a><span class="lineno"> 2516</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  uint32_t memoryTypeIndex,</div> -<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);</div> -<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  </div> -<div class="line"><a name="l02528"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236"> 2528</a></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="l02529"></a><span class="lineno"> 2529</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  uint32_t frameIndex);</div> -<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  </div> -<div class="line"><a name="l02534"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 2534</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div> -<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span> {</div> -<div class="line"><a name="l02537"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 2537</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div> -<div class="line"><a name="l02539"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2539</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> -<div class="line"><a name="l02541"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2541</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l02543"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2543</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> -<div class="line"><a name="l02545"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2545</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> -<div class="line"><a name="l02546"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 2546</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div> -<div class="line"><a name="l02547"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 2547</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div> -<div class="line"><a name="l02548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878"> 2548</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a>;</div> -<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  </div> -<div class="line"><a name="l02551"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2551</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div> -<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span> {</div> -<div class="line"><a name="l02553"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2553</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div> -<div class="line"><a name="l02554"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2554</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l02555"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2555</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div> -<div class="line"><a name="l02556"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034"> 2556</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a>;</div> -<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  </div> -<div class="line"><a name="l02567"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3"> 2567</a></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="l02568"></a><span class="lineno"> 2568</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a>* VMA_NOT_NULL pStats);</div> -<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  </div> -<div class="line"><a name="l02573"></a><span class="lineno"><a class="line" href="struct_vma_budget.html"> 2573</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_budget.html">VmaBudget</a></div> -<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span> {</div> -<div class="line"><a name="l02577"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0"> 2577</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div> -<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  </div> -<div class="line"><a name="l02588"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8"> 2588</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a>;</div> -<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  </div> -<div class="line"><a name="l02598"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6"> 2598</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>;</div> -<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  </div> -<div class="line"><a name="l02609"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd"> 2609</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div> -<div class="line"><a name="l02610"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d"> 2610</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a>;</div> -<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  </div> -<div class="line"><a name="l02622"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba"> 2622</a></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="l02623"></a><span class="lineno"> 2623</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* VMA_NOT_NULL pBudget);</div> -<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  </div> -<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span> <span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l02627"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2627</a></span> <span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div> -<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  </div> -<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  </div> -<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  </div> -<div class="line"><a name="l02635"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0"> 2635</a></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="l02636"></a><span class="lineno"> 2636</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppStatsString,</div> -<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  VkBool32 detailedMap);</div> -<div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  </div> -<div class="line"><a name="l02640"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288"> 2640</a></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="l02641"></a><span class="lineno"> 2641</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <span class="keywordtype">char</span>* VMA_NULLABLE pStatsString);</div> -<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  </div> -<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  </div> -<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div> -<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  </div> -<div class="line"><a name="l02656"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2656</a></span> typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div> -<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span> {</div> -<div class="line"><a name="l02661"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2661</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div> -<div class="line"><a name="l02678"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2678</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div> -<div class="line"><a name="l02688"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2688</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div> -<div class="line"><a name="l02695"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2695</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div> -<div class="line"><a name="l02704"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2704</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div> -<div class="line"><a name="l02710"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"> 2710</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5,</div> -<div class="line"><a name="l02718"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"> 2718</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6,</div> -<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  </div> -<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l02721"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a806e8499dde802e59eb72a1dc811c35f"> 2721</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div> -<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  </div> -<div class="line"><a name="l02724"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2724</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div> -<div class="line"><a name="l02731"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2731</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div> -<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  </div> -<div class="line"><a name="l02742"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2742</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div> -<div class="line"><a name="l02755"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2755</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div> -<div class="line"><a name="l02768"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2768</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div> -<div class="line"><a name="l02775"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2775</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div> -<div class="line"><a name="l02781"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2781</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div> -<div class="line"><a name="l02786"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2786</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div> -<div class="line"><a name="l02792"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2792</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div> -<div class="line"><a name="l02796"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"> 2796</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100,</div> -<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  </div> -<div class="line"><a name="l02801"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2801</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000,</div> -<div class="line"><a name="l02805"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2805</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div> -<div class="line"><a name="l02812"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2812</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div> -<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  </div> -<div class="line"><a name="l02816"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2816</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div> -<div class="line"><a name="l02819"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2819</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div> -<div class="line"><a name="l02822"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2822</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div> -<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  </div> -<div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div> -<div class="line"><a name="l02827"></a><span class="lineno"> 2827</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="l02828"></a><span class="lineno"> 2828</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="l02829"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2829</a></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="l02830"></a><span class="lineno"> 2830</span>  </div> -<div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l02832"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4fceecc301f4064dc808d3cd6c038941"> 2832</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div> -<div class="line"><a name="l02833"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2833</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div> -<div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  </div> -<div class="line"><a name="l02835"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2835</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div> -<div class="line"><a name="l02836"></a><span class="lineno"> 2836</span> {</div> -<div class="line"><a name="l02838"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2838</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div> -<div class="line"><a name="l02844"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2844</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div> -<div class="line"><a name="l02849"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2849</a></span>  VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div> -<div class="line"><a name="l02854"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2854</a></span>  VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div> -<div class="line"><a name="l02862"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2862</a></span>  uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div> -<div class="line"><a name="l02868"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2868</a></span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div> -<div class="line"><a name="l02875"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2875</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div> -<div class="line"><a name="l02876"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a"> 2876</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a>;</div> +<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div> +<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  </div> +<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span> <span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div> +<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  uint32_t memoryType,</div> +<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div> +<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  VkDeviceSize size,</div> +<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> +<div class="line"><a name="l02208"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b"> 2208</a></span> <span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a>)(</div> +<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  uint32_t memoryType,</div> +<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE memory,</div> +<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  VkDeviceSize size,</div> +<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> +<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  </div> +<div class="line"><a name="l02222"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 2222</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div> +<div class="line"><a name="l02224"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 2224</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a7e1ed85f7799600b03ad51a77acc21f3">PFN_vmaAllocateDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div> +<div class="line"><a name="l02226"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 2226</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a154ccaaf53dc2c36378f80f0c4f3679b">PFN_vmaFreeDeviceMemoryFunction</a> VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div> +<div class="line"><a name="l02228"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6"> 2228</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_device_memory_callbacks.html#a24052de0937ddd54015a2df0363903c6">pUserData</a>;</div> +<div class="line"><a name="l02229"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b"> 2229</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a77692d3c8770ea8882d573206bd27b2b">VmaDeviceMemoryCallbacks</a>;</div> +<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  </div> +<div class="line"><a name="l02232"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 2232</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div> +<div class="line"><a name="l02237"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 2237</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div> +<div class="line"><a name="l02262"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 2262</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div> +<div class="line"><a name="l02277"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee"> 2277</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca8fb75bf07cd184ab903596295e863dee">VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT</a> = 0x00000004,</div> +<div class="line"><a name="l02289"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0"> 2289</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4d4687863f7bd4b418c6006dc04400b0">VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT</a> = 0x00000008,</div> +<div class="line"><a name="l02307"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f"> 2307</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca2acce4886d8078552efa38878413970f">VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT</a> = 0x00000010,</div> +<div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089"> 2325</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca5f1b28b0414319d1687e1f2b30ab0089">VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT</a> = 0x00000020,</div> +<div class="line"><a name="l02342"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a"> 2342</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7caffdd7a5169be3dbd7cbf6b3619e4f78a">VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT</a> = 0x00000040,</div> +<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  </div> +<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l02345"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 2345</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div> +<div class="line"><a name="l02346"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 2346</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div> +<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  </div> +<div class="line"><a name="l02352"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 2352</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div> +<div class="line"><a name="l02353"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 2353</a></span>  PFN_vkGetPhysicalDeviceProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div> +<div class="line"><a name="l02354"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 2354</a></span>  PFN_vkGetPhysicalDeviceMemoryProperties VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div> +<div class="line"><a name="l02355"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 2355</a></span>  PFN_vkAllocateMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div> +<div class="line"><a name="l02356"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 2356</a></span>  PFN_vkFreeMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div> +<div class="line"><a name="l02357"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 2357</a></span>  PFN_vkMapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div> +<div class="line"><a name="l02358"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 2358</a></span>  PFN_vkUnmapMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div> +<div class="line"><a name="l02359"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 2359</a></span>  PFN_vkFlushMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div> +<div class="line"><a name="l02360"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 2360</a></span>  PFN_vkInvalidateMappedMemoryRanges VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div> +<div class="line"><a name="l02361"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 2361</a></span>  PFN_vkBindBufferMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div> +<div class="line"><a name="l02362"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 2362</a></span>  PFN_vkBindImageMemory VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div> +<div class="line"><a name="l02363"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 2363</a></span>  PFN_vkGetBufferMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div> +<div class="line"><a name="l02364"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 2364</a></span>  PFN_vkGetImageMemoryRequirements VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div> +<div class="line"><a name="l02365"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 2365</a></span>  PFN_vkCreateBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div> +<div class="line"><a name="l02366"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 2366</a></span>  PFN_vkDestroyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div> +<div class="line"><a name="l02367"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 2367</a></span>  PFN_vkCreateImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div> +<div class="line"><a name="l02368"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 2368</a></span>  PFN_vkDestroyImage VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div> +<div class="line"><a name="l02369"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a"> 2369</a></span>  PFN_vkCmdCopyBuffer VMA_NULLABLE <a class="code" href="struct_vma_vulkan_functions.html#ae5c0db8c89a3b82593dc16aa6a49fa3a">vkCmdCopyBuffer</a>;</div> +<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span> <span class="preprocessor">#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000</span></div> +<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  PFN_vkGetBufferMemoryRequirements2KHR VMA_NULLABLE vkGetBufferMemoryRequirements2KHR;</div> +<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  PFN_vkGetImageMemoryRequirements2KHR VMA_NULLABLE vkGetImageMemoryRequirements2KHR;</div> +<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span> <span class="preprocessor">#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000</span></div> +<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  PFN_vkBindBufferMemory2KHR VMA_NULLABLE vkBindBufferMemory2KHR;</div> +<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  PFN_vkBindImageMemory2KHR VMA_NULLABLE vkBindImageMemory2KHR;</div> +<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000</span></div> +<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  PFN_vkGetPhysicalDeviceMemoryProperties2KHR VMA_NULLABLE vkGetPhysicalDeviceMemoryProperties2KHR;</div> +<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02381"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074"> 2381</a></span> } <a class="code" href="vk__mem__alloc_8h.html#abb0a8e3b5040d847571cca6c7f9a8074">VmaVulkanFunctions</a>;</div> +<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  </div> +<div class="line"><a name="l02384"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 2384</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div> +<div class="line"><a name="l02390"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 2390</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div> +<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  </div> +<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l02393"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 2393</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div> +<div class="line"><a name="l02394"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 2394</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div> +<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  </div> +<div class="line"><a name="l02397"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 2397</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div> +<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span> {</div> +<div class="line"><a name="l02400"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 2400</a></span>  <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div> +<div class="line"><a name="l02408"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 2408</a></span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NOT_NULL <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div> +<div class="line"><a name="l02409"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc"> 2409</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a16e21c877101493fce582664cd8754fc">VmaRecordSettings</a>;</div> +<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  </div> +<div class="line"><a name="l02412"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 2412</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div> +<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span> {</div> +<div class="line"><a name="l02415"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 2415</a></span>  <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div> +<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  </div> +<div class="line"><a name="l02418"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 2418</a></span>  VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div> +<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  </div> +<div class="line"><a name="l02421"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 2421</a></span>  VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div> +<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  </div> +<div class="line"><a name="l02424"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 2424</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div> +<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  </div> +<div class="line"><a name="l02427"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 2427</a></span>  <span class="keyword">const</span> VkAllocationCallbacks* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div> +<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  </div> +<div class="line"><a name="l02430"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 2430</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div> +<div class="line"><a name="l02444"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 2444</a></span>  uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div> +<div class="line"><a name="l02469"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 2469</a></span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(<span class="stringliteral">"VkPhysicalDeviceMemoryProperties::memoryHeapCount"</span>) <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div> +<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  </div> +<div class="line"><a name="l02475"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 2475</a></span>  const <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div> +<div class="line"><a name="l02482"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 2482</a></span>  const <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* VMA_NULLABLE <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div> +<div class="line"><a name="l02487"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b"> 2487</a></span>  VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_create_info.html#a70dd42e29b1df1d1b9b61532ae0b370b">instance</a>;</div> +<div class="line"><a name="l02496"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285"> 2496</a></span>  uint32_t <a class="code" href="struct_vma_allocator_create_info.html#ae0ffc55139b54520a6bb704b29ffc285">vulkanApiVersion</a>;</div> +<div class="line"><a name="l02497"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aad9652301d33759b83e52d4f3605a14a"> 2497</a></span> } <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>;</div> +<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  </div> +<div class="line"><a name="l02500"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb"> 2500</a></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="l02501"></a><span class="lineno"> 2501</span>  const <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> +<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE * VMA_NOT_NULL pAllocator);</div> +<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  </div> +<div class="line"><a name="l02505"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d"> 2505</a></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="l02506"></a><span class="lineno"> 2506</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NULLABLE allocator);</div> +<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  </div> +<div class="line"><a name="l02510"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html"> 2510</a></span> typedef struct <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a></div> +<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span> {</div> +<div class="line"><a name="l02516"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe"> 2516</a></span>  VkInstance VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a2ed6a4d2d3fea039d66a13f15d0ce5fe">instance</a>;</div> +<div class="line"><a name="l02521"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a"> 2521</a></span>  VkPhysicalDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#aba2b703f96e51d567717e1fb2935b47a">physicalDevice</a>;</div> +<div class="line"><a name="l02526"></a><span class="lineno"><a class="line" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357"> 2526</a></span>  VkDevice VMA_NOT_NULL <a class="code" href="struct_vma_allocator_info.html#a012b4c485bf3b0ea8921352c5ee0c357">device</a>;</div> +<div class="line"><a name="l02527"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c"> 2527</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1988031b0223fdbd564250fa1edd942c">VmaAllocatorInfo</a>;</div> +<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  </div> +<div class="line"><a name="l02534"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7"> 2534</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#afa02231a791b37255720d566a52683e7">vmaGetAllocatorInfo</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_allocator_info.html">VmaAllocatorInfo</a>* VMA_NOT_NULL pAllocatorInfo);</div> +<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  </div> +<div class="line"><a name="l02540"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0"> 2540</a></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="l02541"></a><span class="lineno"> 2541</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceProperties);</div> +<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  </div> +<div class="line"><a name="l02548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19"> 2548</a></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="l02549"></a><span class="lineno"> 2549</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties* VMA_NULLABLE * VMA_NOT_NULL ppPhysicalDeviceMemoryProperties);</div> +<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  </div> +<div class="line"><a name="l02558"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca"> 2558</a></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="l02559"></a><span class="lineno"> 2559</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  uint32_t memoryTypeIndex,</div> +<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  VkMemoryPropertyFlags* VMA_NOT_NULL pFlags);</div> +<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  </div> +<div class="line"><a name="l02571"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236"> 2571</a></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="l02572"></a><span class="lineno"> 2572</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  uint32_t frameIndex);</div> +<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  </div> +<div class="line"><a name="l02577"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 2577</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div> +<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span> {</div> +<div class="line"><a name="l02580"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 2580</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div> +<div class="line"><a name="l02582"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 2582</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> +<div class="line"><a name="l02584"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 2584</a></span>  uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l02586"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 2586</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> +<div class="line"><a name="l02588"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 2588</a></span>  VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> +<div class="line"><a name="l02589"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599"> 2589</a></span>  VkDeviceSize allocationSizeMin, <a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>, allocationSizeMax;</div> +<div class="line"><a name="l02590"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc"> 2590</a></span>  VkDeviceSize unusedRangeSizeMin, <a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>, unusedRangeSizeMax;</div> +<div class="line"><a name="l02591"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878"> 2591</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aec5b57e29c97b5d69c6d5654d60df878">VmaStatInfo</a>;</div> +<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>  </div> +<div class="line"><a name="l02594"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 2594</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div> +<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span> {</div> +<div class="line"><a name="l02596"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 2596</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div> +<div class="line"><a name="l02597"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 2597</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l02598"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 2598</a></span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div> +<div class="line"><a name="l02599"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034"> 2599</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a21813b2efdf3836767a9058cd8a94034">VmaStats</a>;</div> +<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  </div> +<div class="line"><a name="l02610"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3"> 2610</a></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="l02611"></a><span class="lineno"> 2611</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  <a class="code" href="struct_vma_stats.html">VmaStats</a>* VMA_NOT_NULL pStats);</div> +<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  </div> +<div class="line"><a name="l02616"></a><span class="lineno"><a class="line" href="struct_vma_budget.html"> 2616</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_budget.html">VmaBudget</a></div> +<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span> {</div> +<div class="line"><a name="l02620"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0"> 2620</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a58b492901baab685f466199124e514a0">blockBytes</a>;</div> +<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  </div> +<div class="line"><a name="l02631"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8"> 2631</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a7e2a6583ebd63e194951c542563804d8">allocationBytes</a>;</div> +<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  </div> +<div class="line"><a name="l02641"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6"> 2641</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#a84dd1ecca8b0110259eb206dbadb11f6">usage</a>;</div> +<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  </div> +<div class="line"><a name="l02652"></a><span class="lineno"><a class="line" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd"> 2652</a></span>  VkDeviceSize <a class="code" href="struct_vma_budget.html#ab82e1d1754c2d210d0bdf90220bc6cdd">budget</a>;</div> +<div class="line"><a name="l02653"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d"> 2653</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aa078667e71b1ef24e87a6a30d128381d">VmaBudget</a>;</div> +<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  </div> +<div class="line"><a name="l02665"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aec0ed24ebea2d0099eed5f801daaefba"> 2665</a></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="l02666"></a><span class="lineno"> 2666</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* VMA_NOT_NULL pBudget);</div> +<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  </div> +<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span> <span class="preprocessor">#ifndef VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l02670"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 2670</a></span> <span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div> +<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  </div> +<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  </div> +<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  </div> +<div class="line"><a name="l02678"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0"> 2678</a></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="l02679"></a><span class="lineno"> 2679</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppStatsString,</div> +<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  VkBool32 detailedMap);</div> +<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  </div> +<div class="line"><a name="l02683"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288"> 2683</a></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="l02684"></a><span class="lineno"> 2684</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="keywordtype">char</span>* VMA_NULLABLE pStatsString);</div> +<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  </div> +<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  </div> +<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div> +<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  </div> +<div class="line"><a name="l02699"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 2699</a></span> typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div> +<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span> {</div> +<div class="line"><a name="l02704"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 2704</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div> +<div class="line"><a name="l02721"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 2721</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div> +<div class="line"><a name="l02731"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 2731</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div> +<div class="line"><a name="l02738"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 2738</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div> +<div class="line"><a name="l02747"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 2747</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div> +<div class="line"><a name="l02753"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500"> 2753</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca416a444d4d0fc20067c3f76f32ff2500">VMA_MEMORY_USAGE_CPU_COPY</a> = 5,</div> +<div class="line"><a name="l02761"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d"> 2761</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca835333d9072db63a653818030e17614d">VMA_MEMORY_USAGE_GPU_LAZILY_ALLOCATED</a> = 6,</div> +<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  </div> +<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l02764"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 2764</a></span> } <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div> +<div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>  </div> +<div class="line"><a name="l02767"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 2767</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div> +<div class="line"><a name="l02774"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 2774</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div> +<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  </div> +<div class="line"><a name="l02785"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 2785</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div> +<div class="line"><a name="l02798"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 2798</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div> +<div class="line"><a name="l02811"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 2811</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div> +<div class="line"><a name="l02818"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 2818</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div> +<div class="line"><a name="l02824"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 2824</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div> +<div class="line"><a name="l02829"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 2829</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div> +<div class="line"><a name="l02835"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea"> 2835</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a2310568c62208af432724305fe29ccea">VMA_ALLOCATION_CREATE_DONT_BIND_BIT</a> = 0x00000080,</div> +<div class="line"><a name="l02839"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d"> 2839</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ab8b1764f3e9022368e440c057783b92d">VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT</a> = 0x00000100,</div> +<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  </div> +<div class="line"><a name="l02844"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 2844</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> = 0x00010000,</div> +<div class="line"><a name="l02848"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 2848</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div> +<div class="line"><a name="l02855"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 2855</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div> +<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  </div> +<div class="line"><a name="l02859"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 2859</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div> +<div class="line"><a name="l02862"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 2862</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div> +<div class="line"><a name="l02865"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 2865</a></span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div> +<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  </div> +<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div> +<div class="line"><a name="l02870"></a><span class="lineno"> 2870</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="l02871"></a><span class="lineno"> 2871</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="l02872"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 2872</a></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="l02873"></a><span class="lineno"> 2873</span>  </div> +<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l02875"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 2875</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div> +<div class="line"><a name="l02876"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 2876</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div> <div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  </div> -<div class="line"><a name="l02894"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a"> 2894</a></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="l02895"></a><span class="lineno"> 2895</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  uint32_t memoryTypeBits,</div> -<div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> -<div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> -<div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  </div> -<div class="line"><a name="l02912"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888"> 2912</a></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="l02913"></a><span class="lineno"> 2913</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div> -<div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> -<div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> -<div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  </div> -<div class="line"><a name="l02930"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472"> 2930</a></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="l02931"></a><span class="lineno"> 2931</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div> -<div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> -<div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> -<div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>  </div> -<div class="line"><a name="l02937"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2937</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div> -<div class="line"><a name="l02955"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2955</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div> -<div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  </div> -<div class="line"><a name="l02972"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2972</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div> -<div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  </div> -<div class="line"><a name="l02983"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2983</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div> -<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>  </div> -<div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div> -<div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div> -<div class="line"><a name="l02989"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2989</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</div> -<div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  </div> -<div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l02992"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4d4f2efc2509157a9e4ecd4fd7942303"> 2992</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div> -<div class="line"><a name="l02993"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2993</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div> -<div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  </div> -<div class="line"><a name="l02997"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2997</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div> -<div class="line"><a name="l03000"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 3000</a></span>  uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div> -<div class="line"><a name="l03003"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 3003</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div> -<div class="line"><a name="l03012"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 3012</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div> -<div class="line"><a name="l03017"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 3017</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div> -<div class="line"><a name="l03025"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 3025</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div> -<div class="line"><a name="l03039"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 3039</a></span>  uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div> -<div class="line"><a name="l03040"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67"> 3040</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a>;</div> -<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  </div> -<div class="line"><a name="l03044"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 3044</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div> -<div class="line"><a name="l03047"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 3047</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div> -<div class="line"><a name="l03050"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 3050</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div> -<div class="line"><a name="l03053"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 3053</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> -<div class="line"><a name="l03056"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 3056</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l03063"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 3063</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div> -<div class="line"><a name="l03066"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 3066</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div> -<div class="line"><a name="l03067"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1"> 3067</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a>;</div> -<div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  </div> -<div class="line"><a name="l03075"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50"> 3075</a></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="l03076"></a><span class="lineno"> 3076</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> -<div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE * VMA_NOT_NULL pPool);</div> -<div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  </div> -<div class="line"><a name="l03082"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1"> 3082</a></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="l03083"></a><span class="lineno"> 3083</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE pool);</div> -<div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  </div> -<div class="line"><a name="l03092"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153"> 3092</a></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="l03093"></a><span class="lineno"> 3093</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> -<div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* VMA_NOT_NULL pPoolStats);</div> -<div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  </div> -<div class="line"><a name="l03103"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024"> 3103</a></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="l03104"></a><span class="lineno"> 3104</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> -<div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>  <span class="keywordtype">size_t</span>* VMA_NULLABLE pLostAllocationCount);</div> -<div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  </div> -<div class="line"><a name="l03122"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89"> 3122</a></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> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool);</div> -<div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  </div> -<div class="line"><a name="l03130"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030"> 3130</a></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="l03131"></a><span class="lineno"> 3131</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> -<div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppName);</div> -<div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>  </div> -<div class="line"><a name="l03140"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58"> 3140</a></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="l03141"></a><span class="lineno"> 3141</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> -<div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE pName);</div> -<div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  </div> -<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div> -<div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  </div> -<div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  </div> -<div class="line"><a name="l03173"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 3173</a></span> typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div> -<div class="line"><a name="l03178"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 3178</a></span>  uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div> -<div class="line"><a name="l03187"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 3187</a></span>  VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div> -<div class="line"><a name="l03192"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 3192</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div> -<div class="line"><a name="l03203"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 3203</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div> -<div class="line"><a name="l03212"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 3212</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div> -<div class="line"><a name="l03217"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 3217</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div> -<div class="line"><a name="l03218"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50"> 3218</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a>;</div> -<div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  </div> -<div class="line"><a name="l03230"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8"> 3230</a></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="l03231"></a><span class="lineno"> 3231</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL pVkMemoryRequirements,</div> -<div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> -<div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> -<div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> -<div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>  </div> -<div class="line"><a name="l03256"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1"> 3256</a></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="l03257"></a><span class="lineno"> 3257</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pVkMemoryRequirements,</div> -<div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pCreateInfo,</div> -<div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div> -<div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationInfo);</div> -<div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>  </div> -<div class="line"><a name="l03270"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b"> 3270</a></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="l03271"></a><span class="lineno"> 3271</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div> -<div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> -<div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> -<div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> -<div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>  </div> -<div class="line"><a name="l03278"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb"> 3278</a></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="l03279"></a><span class="lineno"> 3279</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div> -<div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> -<div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> -<div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> -<div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>  </div> -<div class="line"><a name="l03289"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f"> 3289</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div> -<div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> -<div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>  </div> -<div class="line"><a name="l03303"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e"> 3303</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div> -<div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);</div> -<div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>  </div> -<div class="line"><a name="l03315"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696"> 3315</a></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="l03316"></a><span class="lineno"> 3316</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>  VkDeviceSize newSize);</div> -<div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>  </div> -<div class="line"><a name="l03336"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b"> 3336</a></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="l03337"></a><span class="lineno"> 3337</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NOT_NULL pAllocationInfo);</div> -<div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  </div> -<div class="line"><a name="l03355"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a"> 3355</a></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="l03356"></a><span class="lineno"> 3356</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div> -<div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>  </div> -<div class="line"><a name="l03372"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f"> 3372</a></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="l03373"></a><span class="lineno"> 3373</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> -<div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>  </div> -<div class="line"><a name="l03387"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1"> 3387</a></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="l03388"></a><span class="lineno"> 3388</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation);</div> -<div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  </div> -<div class="line"><a name="l03429"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069"> 3429</a></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="l03430"></a><span class="lineno"> 3430</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="keywordtype">void</span>* VMA_NULLABLE * VMA_NOT_NULL ppData);</div> -<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>  </div> -<div class="line"><a name="l03442"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45"> 3442</a></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="l03443"></a><span class="lineno"> 3443</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div> -<div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>  </div> -<div class="line"><a name="l03467"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f"> 3467</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(</div> -<div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  VkDeviceSize size);</div> -<div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  </div> -<div class="line"><a name="l03494"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae"> 3494</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(</div> -<div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  VkDeviceSize size);</div> +<div class="line"><a name="l02878"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 2878</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div> +<div class="line"><a name="l02879"></a><span class="lineno"> 2879</span> {</div> +<div class="line"><a name="l02881"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 2881</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div> +<div class="line"><a name="l02887"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 2887</a></span>  <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div> +<div class="line"><a name="l02892"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 2892</a></span>  VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div> +<div class="line"><a name="l02897"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2897</a></span>  VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div> +<div class="line"><a name="l02905"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2905</a></span>  uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div> +<div class="line"><a name="l02911"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2911</a></span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div> +<div class="line"><a name="l02918"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2918</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div> +<div class="line"><a name="l02925"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7"> 2925</a></span>  <span class="keywordtype">float</span> <a class="code" href="struct_vma_allocation_create_info.html#a983d39e1a2e63649d78a960aa2fdd0f7">priority</a>;</div> +<div class="line"><a name="l02926"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a"> 2926</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a3bf110892ea2fb4649fedb68488d026a">VmaAllocationCreateInfo</a>;</div> +<div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  </div> +<div class="line"><a name="l02944"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a"> 2944</a></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="l02945"></a><span class="lineno"> 2945</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  uint32_t memoryTypeBits,</div> +<div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> +<div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> +<div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  </div> +<div class="line"><a name="l02962"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888"> 2962</a></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="l02963"></a><span class="lineno"> 2963</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div> +<div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> +<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> +<div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  </div> +<div class="line"><a name="l02980"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472"> 2980</a></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="l02981"></a><span class="lineno"> 2981</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>  <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div> +<div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> +<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>  uint32_t* VMA_NOT_NULL pMemoryTypeIndex);</div> +<div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>  </div> +<div class="line"><a name="l02987"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2987</a></span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div> +<div class="line"><a name="l03005"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 3005</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div> +<div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  </div> +<div class="line"><a name="l03022"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 3022</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div> +<div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  </div> +<div class="line"><a name="l03033"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 3033</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div> +<div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>  </div> +<div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div> +<div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div> +<div class="line"><a name="l03039"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 3039</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</div> +<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  </div> +<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l03042"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 3042</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div> +<div class="line"><a name="l03043"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 3043</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div> +<div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  </div> +<div class="line"><a name="l03047"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 3047</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div> +<div class="line"><a name="l03050"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 3050</a></span>  uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div> +<div class="line"><a name="l03053"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 3053</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div> +<div class="line"><a name="l03062"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 3062</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div> +<div class="line"><a name="l03067"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 3067</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div> +<div class="line"><a name="l03075"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 3075</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div> +<div class="line"><a name="l03089"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 3089</a></span>  uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div> +<div class="line"><a name="l03095"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274"> 3095</a></span>  <span class="keywordtype">float</span> <a class="code" href="struct_vma_pool_create_info.html#a16e686c688f6725f119ebf6e24ab5274">priority</a>;</div> +<div class="line"><a name="l03102"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb"> 3102</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#ade3eca546f0c6ab4e8fbf20eb6d854cb">minAllocationAlignment</a>;</div> +<div class="line"><a name="l03112"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7"> 3112</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_pool_create_info.html#af0f8c58f51a2a7a0a389dc79565044d7">pMemoryAllocateNext</a>;</div> +<div class="line"><a name="l03113"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67"> 3113</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1017aa83489c0eee8d2163d2bf253f67">VmaPoolCreateInfo</a>;</div> +<div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  </div> +<div class="line"><a name="l03117"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 3117</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div> +<div class="line"><a name="l03120"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 3120</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div> +<div class="line"><a name="l03123"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 3123</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div> +<div class="line"><a name="l03126"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 3126</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> +<div class="line"><a name="l03129"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 3129</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l03136"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 3136</a></span>  VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div> +<div class="line"><a name="l03139"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 3139</a></span>  <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div> +<div class="line"><a name="l03140"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1"> 3140</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a4759a2d9f99c19ba7627553c847132f1">VmaPoolStats</a>;</div> +<div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>  </div> +<div class="line"><a name="l03148"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50"> 3148</a></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="l03149"></a><span class="lineno"> 3149</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> +<div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE * VMA_NOT_NULL pPool);</div> +<div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>  </div> +<div class="line"><a name="l03155"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1"> 3155</a></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="l03156"></a><span class="lineno"> 3156</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NULLABLE pool);</div> +<div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>  </div> +<div class="line"><a name="l03165"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153"> 3165</a></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="l03166"></a><span class="lineno"> 3166</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> +<div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>  <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* VMA_NOT_NULL pPoolStats);</div> +<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>  </div> +<div class="line"><a name="l03176"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024"> 3176</a></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="l03177"></a><span class="lineno"> 3177</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> +<div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  <span class="keywordtype">size_t</span>* VMA_NULLABLE pLostAllocationCount);</div> +<div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  </div> +<div class="line"><a name="l03195"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89"> 3195</a></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> VMA_NOT_NULL allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool);</div> +<div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>  </div> +<div class="line"><a name="l03203"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af09b4e4eafdbee812e8d73ddf960f030"> 3203</a></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="l03204"></a><span class="lineno"> 3204</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> +<div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE * VMA_NOT_NULL ppName);</div> +<div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>  </div> +<div class="line"><a name="l03213"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#adbae3a0b4ab078024462fc85c37f3b58"> 3213</a></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="l03214"></a><span class="lineno"> 3214</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL pool,</div> +<div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_NULLABLE pName);</div> +<div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>  </div> +<div class="line"><a name="l03242"></a><span class="lineno"> 3242</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div> +<div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>  </div> +<div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  </div> +<div class="line"><a name="l03246"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 3246</a></span> typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div> +<div class="line"><a name="l03251"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 3251</a></span>  uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div> +<div class="line"><a name="l03260"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 3260</a></span>  VkDeviceMemory VMA_NULLABLE_NON_DISPATCHABLE <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div> +<div class="line"><a name="l03270"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 3270</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div> +<div class="line"><a name="l03281"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 3281</a></span>  VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div> +<div class="line"><a name="l03290"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 3290</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div> +<div class="line"><a name="l03295"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 3295</a></span>  <span class="keywordtype">void</span>* VMA_NULLABLE <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div> +<div class="line"><a name="l03296"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50"> 3296</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a1cf7774606721026a68aabe3af2e5b50">VmaAllocationInfo</a>;</div> +<div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>  </div> +<div class="line"><a name="l03308"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8"> 3308</a></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="l03309"></a><span class="lineno"> 3309</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL pVkMemoryRequirements,</div> +<div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> +<div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> +<div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> +<div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>  </div> +<div class="line"><a name="l03334"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad37e82e492b3de38fc3f4cffd9ad0ae1"> 3334</a></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="l03335"></a><span class="lineno"> 3335</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>  <span class="keyword">const</span> VkMemoryRequirements* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pVkMemoryRequirements,</div> +<div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pCreateInfo,</div> +<div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div> +<div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationInfo);</div> +<div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>  </div> +<div class="line"><a name="l03348"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b"> 3348</a></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="l03349"></a><span class="lineno"> 3349</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div> +<div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> +<div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> +<div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> +<div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>  </div> +<div class="line"><a name="l03356"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb"> 3356</a></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="l03357"></a><span class="lineno"> 3357</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div> +<div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pCreateInfo,</div> +<div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> +<div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> +<div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>  </div> +<div class="line"><a name="l03367"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f"> 3367</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a5fea5518972ae9094b1526cbcb19b05f">vmaFreeMemory</a>(</div> +<div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> +<div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>  </div> +<div class="line"><a name="l03381"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e"> 3381</a></span> VMA_CALL_PRE <span class="keywordtype">void</span> VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a834b1e4aef395c0a1d56a28e69a4a17e">vmaFreeMemoryPages</a>(</div> +<div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations);</div> +<div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>  </div> +<div class="line"><a name="l03402"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b"> 3402</a></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="l03403"></a><span class="lineno"> 3403</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NOT_NULL pAllocationInfo);</div> +<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  </div> +<div class="line"><a name="l03421"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a"> 3421</a></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="l03422"></a><span class="lineno"> 3422</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div> +<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  </div> +<div class="line"><a name="l03438"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f"> 3438</a></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="l03439"></a><span class="lineno"> 3439</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="keywordtype">void</span>* VMA_NULLABLE pUserData);</div> +<div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  </div> +<div class="line"><a name="l03453"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1"> 3453</a></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="l03454"></a><span class="lineno"> 3454</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation);</div> +<div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>  </div> +<div class="line"><a name="l03495"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069"> 3495</a></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="l03496"></a><span class="lineno"> 3496</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  <span class="keywordtype">void</span>* VMA_NULLABLE * VMA_NOT_NULL ppData);</div> <div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  </div> -<div class="line"><a name="l03514"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc"> 3514</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div> -<div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  uint32_t allocationCount,</div> -<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div> -<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div> -<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div> -<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>  </div> -<div class="line"><a name="l03535"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5"> 3535</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div> -<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>  uint32_t allocationCount,</div> -<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div> -<div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div> -<div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div> -<div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  </div> -<div class="line"><a name="l03558"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98"> 3558</a></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> VMA_NOT_NULL allocator, uint32_t memoryTypeBits);</div> -<div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  </div> -<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div> -<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>  </div> -<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> {</div> -<div class="line"><a name="l03570"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"> 3570</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1,</div> -<div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> -<div class="line"><a name="l03572"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a13415cc0b443353a7b5abda300b833fc"> 3572</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div> -<div class="line"><a name="l03573"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 3573</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>;</div> -<div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>  </div> -<div class="line"><a name="l03579"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 3579</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> {</div> -<div class="line"><a name="l03582"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 3582</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> <a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>;</div> -<div class="line"><a name="l03585"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 3585</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div> -<div class="line"><a name="l03594"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32"> 3594</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>;</div> -<div class="line"><a name="l03600"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 3600</a></span>  VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div> -<div class="line"><a name="l03603"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 3603</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div> -<div class="line"><a name="l03619"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b"> 3619</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(poolCount) <a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>;</div> -<div class="line"><a name="l03624"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 3624</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div> -<div class="line"><a name="l03629"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 3629</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div> -<div class="line"><a name="l03634"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 3634</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div> -<div class="line"><a name="l03639"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 3639</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div> -<div class="line"><a name="l03648"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 3648</a></span>  VkCommandBuffer VMA_NULLABLE <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div> -<div class="line"><a name="l03649"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937"> 3649</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937">VmaDefragmentationInfo2</a>;</div> -<div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  </div> -<div class="line"><a name="l03651"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html"> 3651</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a> {</div> -<div class="line"><a name="l03652"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc"> 3652</a></span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL <a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a>;</div> -<div class="line"><a name="l03653"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769"> 3653</a></span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a>;</div> -<div class="line"><a name="l03654"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6"> 3654</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a>;</div> -<div class="line"><a name="l03655"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5"> 3655</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a>;</div> -<div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  </div> -<div class="line"><a name="l03661"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html"> 3661</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a> {</div> -<div class="line"><a name="l03662"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c"> 3662</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div> -<div class="line"><a name="l03663"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792"> 3663</a></span>  <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(moveCount) <a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div> -<div class="line"><a name="l03664"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e"> 3664</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a>;</div> -<div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>  </div> -<div class="line"><a name="l03670"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 3670</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div> -<div class="line"><a name="l03675"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 3675</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div> -<div class="line"><a name="l03680"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 3680</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div> -<div class="line"><a name="l03681"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa"> 3681</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>;</div> -<div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  </div> -<div class="line"><a name="l03684"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 3684</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div> -<div class="line"><a name="l03686"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 3686</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div> -<div class="line"><a name="l03688"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 3688</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div> -<div class="line"><a name="l03690"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 3690</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div> -<div class="line"><a name="l03692"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 3692</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div> -<div class="line"><a name="l03693"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403"> 3693</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a>;</div> -<div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>  </div> -<div class="line"><a name="l03724"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a"> 3724</a></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="l03725"></a><span class="lineno"> 3725</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* VMA_NOT_NULL pInfo,</div> -<div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pStats,</div> -<div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE * VMA_NOT_NULL pContext);</div> -<div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>  </div> -<div class="line"><a name="l03735"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2"> 3735</a></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="l03736"></a><span class="lineno"> 3736</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context);</div> -<div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>  </div> -<div class="line"><a name="l03739"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b"> 3739</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div> -<div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context,</div> -<div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>  <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* VMA_NOT_NULL pInfo</div> -<div class="line"><a name="l03743"></a><span class="lineno"> 3743</span> );</div> -<div class="line"><a name="l03744"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd"> 3744</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div> -<div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context</div> -<div class="line"><a name="l03747"></a><span class="lineno"> 3747</span> );</div> +<div class="line"><a name="l03508"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45"> 3508</a></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="l03509"></a><span class="lineno"> 3509</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation);</div> +<div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>  </div> +<div class="line"><a name="l03533"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f"> 3533</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a30c37c1eec6025f397be41644f48490f">vmaFlushAllocation</a>(</div> +<div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>  VkDeviceSize size);</div> +<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  </div> +<div class="line"><a name="l03560"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae"> 3560</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#aaa8412919139ef413a4215ac6a290fae">vmaInvalidateAllocation</a>(</div> +<div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  VkDeviceSize size);</div> +<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  </div> +<div class="line"><a name="l03580"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc"> 3580</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac3dd00da721875ed99fa8a881922bdfc">vmaFlushAllocations</a>(</div> +<div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  uint32_t allocationCount,</div> +<div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div> +<div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div> +<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div> +<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  </div> +<div class="line"><a name="l03601"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5"> 3601</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ab25b558d75f7378ec944a1522fdcc3c5">vmaInvalidateAllocations</a>(</div> +<div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  uint32_t allocationCount,</div> +<div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) allocations,</div> +<div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) offsets,</div> +<div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  <span class="keyword">const</span> VkDeviceSize* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) sizes);</div> +<div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  </div> +<div class="line"><a name="l03624"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98"> 3624</a></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> VMA_NOT_NULL allocator, uint32_t memoryTypeBits);</div> +<div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>  </div> +<div class="line"><a name="l03632"></a><span class="lineno"> 3632</span> VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div> +<div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  </div> +<div class="line"><a name="l03634"></a><span class="lineno"> 3634</span> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> {</div> +<div class="line"><a name="l03636"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33"> 3636</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca31af49446af2459284a568ce2f3fdd33">VMA_DEFRAGMENTATION_FLAG_INCREMENTAL</a> = 0x1,</div> +<div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div> +<div class="line"><a name="l03638"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"> 3638</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div> +<div class="line"><a name="l03639"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 3639</a></span> <span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>;</div> +<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  </div> +<div class="line"><a name="l03645"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 3645</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> {</div> +<div class="line"><a name="l03648"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 3648</a></span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> <a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>;</div> +<div class="line"><a name="l03651"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba"> 3651</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a3cf86ab32c1da779b4923d301a3056ba">allocationCount</a>;</div> +<div class="line"><a name="l03660"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32"> 3660</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#ab6d288f29d028156cf73542d630a2e32">pAllocations</a>;</div> +<div class="line"><a name="l03666"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 3666</a></span>  VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div> +<div class="line"><a name="l03669"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d"> 3669</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a7e70aa2a1081d849dcc7829b19d3ec9d">poolCount</a>;</div> +<div class="line"><a name="l03685"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b"> 3685</a></span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> VMA_NOT_NULL * VMA_NULLABLE VMA_LEN_IF_NOT_NULL(poolCount) <a class="code" href="struct_vma_defragmentation_info2.html#a3c9c6aa5c97d5670f8e362b3a6f3029b">pPools</a>;</div> +<div class="line"><a name="l03690"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 3690</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div> +<div class="line"><a name="l03695"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 3695</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div> +<div class="line"><a name="l03700"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 3700</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div> +<div class="line"><a name="l03705"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 3705</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div> +<div class="line"><a name="l03714"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd"> 3714</a></span>  VkCommandBuffer VMA_NULLABLE <a class="code" href="struct_vma_defragmentation_info2.html#a7f71f39590c5316771493d2333f9c1bd">commandBuffer</a>;</div> +<div class="line"><a name="l03715"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937"> 3715</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad6daeffaa670ce6d11a203a6224c9937">VmaDefragmentationInfo2</a>;</div> +<div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>  </div> +<div class="line"><a name="l03717"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html"> 3717</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a> {</div> +<div class="line"><a name="l03718"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc"> 3718</a></span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL <a class="code" href="struct_vma_defragmentation_pass_move_info.html#ae885c861c2dd8d622e6c19e281d035cc">allocation</a>;</div> +<div class="line"><a name="l03719"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769"> 3719</a></span>  VkDeviceMemory VMA_NOT_NULL_NON_DISPATCHABLE <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a06eb0c8690aa0d3478a036753492e769">memory</a>;</div> +<div class="line"><a name="l03720"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6"> 3720</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_pass_move_info.html#a8ab4508bc03625b0653c880576be96c6">offset</a>;</div> +<div class="line"><a name="l03721"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5"> 3721</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad6799e8e2b1527abfc84d33bc44aeaf5">VmaDefragmentationPassMoveInfo</a>;</div> +<div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>  </div> +<div class="line"><a name="l03727"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html"> 3727</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a> {</div> +<div class="line"><a name="l03728"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c"> 3728</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_pass_info.html#ac1086e657ba995f8d1f4e49b83dcfb6c">moveCount</a>;</div> +<div class="line"><a name="l03729"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792"> 3729</a></span>  <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(moveCount) <a class="code" href="struct_vma_defragmentation_pass_info.html#acbd42d4a3357999da130a95cd99a3792">pMoves</a>;</div> +<div class="line"><a name="l03730"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e"> 3730</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a72aebd522242d56abea67b4f47f6549e">VmaDefragmentationPassInfo</a>;</div> +<div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>  </div> +<div class="line"><a name="l03736"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 3736</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div> +<div class="line"><a name="l03741"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 3741</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div> +<div class="line"><a name="l03746"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 3746</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div> +<div class="line"><a name="l03747"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa"> 3747</a></span> } <a class="code" href="vk__mem__alloc_8h.html#a2bf47f96bf92bed2a49461bd9af3acfa">VmaDefragmentationInfo</a>;</div> <div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>  </div> -<div class="line"><a name="l03789"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac"> 3789</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div> -<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div> -<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationsChanged,</div> -<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* VMA_NULLABLE pDefragmentationInfo,</div> -<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pDefragmentationStats);</div> -<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>  </div> -<div class="line"><a name="l03809"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470"> 3809</a></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="l03810"></a><span class="lineno"> 3810</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer);</div> -<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  </div> -<div class="line"><a name="l03824"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a"> 3824</a></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="l03825"></a><span class="lineno"> 3825</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div> -<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div> -<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>  </div> -<div class="line"><a name="l03843"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5"> 3843</a></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="l03844"></a><span class="lineno"> 3844</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image);</div> -<div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>  </div> -<div class="line"><a name="l03858"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc"> 3858</a></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="l03859"></a><span class="lineno"> 3859</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> -<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div> -<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div> -<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>  </div> -<div class="line"><a name="l03891"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51"> 3891</a></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="l03892"></a><span class="lineno"> 3892</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div> -<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> -<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>  VkBuffer VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pBuffer,</div> -<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> -<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> -<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  </div> -<div class="line"><a name="l03910"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77"> 3910</a></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="l03911"></a><span class="lineno"> 3911</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  VkBuffer VMA_NULLABLE_NON_DISPATCHABLE buffer,</div> -<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> -<div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>  </div> -<div class="line"><a name="l03916"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73"> 3916</a></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="l03917"></a><span class="lineno"> 3917</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>  <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div> -<div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> -<div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>  VkImage VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pImage,</div> -<div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> -<div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> -<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>  </div> -<div class="line"><a name="l03935"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e"> 3935</a></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="l03936"></a><span class="lineno"> 3936</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> -<div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>  VkImage VMA_NULLABLE_NON_DISPATCHABLE image,</div> -<div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> -<div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>  </div> -<div class="line"><a name="l03940"></a><span class="lineno"> 3940</span> <span class="preprocessor">#ifdef __cplusplus</span></div> -<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span> }</div> -<div class="line"><a name="l03942"></a><span class="lineno"> 3942</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>  </div> -<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span> <span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div> -<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>  </div> -<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span> <span class="comment">// For Visual Studio IntelliSense.</span></div> -<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span> <span class="preprocessor">#if defined(__cplusplus) && defined(__INTELLISENSE__)</span></div> -<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span> <span class="preprocessor">#define VMA_IMPLEMENTATION</span></div> -<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  </div> -<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span> <span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div> -<div class="line"><a name="l03952"></a><span class="lineno"> 3952</span> <span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div> -<div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>  </div> -<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span> <span class="preprocessor">#include <cstdint></span></div> -<div class="line"><a name="l03955"></a><span class="lineno"> 3955</span> <span class="preprocessor">#include <cstdlib></span></div> -<div class="line"><a name="l03956"></a><span class="lineno"> 3956</span> <span class="preprocessor">#include <cstring></span></div> -<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span> <span class="preprocessor">#include <utility></span></div> -<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  </div> -<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l03960"></a><span class="lineno"> 3960</span> <span class="preprocessor"> #include <chrono></span></div> -<div class="line"><a name="l03961"></a><span class="lineno"> 3961</span> <span class="preprocessor"> #if defined(_WIN32)</span></div> -<div class="line"><a name="l03962"></a><span class="lineno"> 3962</span> <span class="preprocessor"> #include <windows.h></span></div> -<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span> <span class="preprocessor"> #include <sstream></span></div> -<div class="line"><a name="l03965"></a><span class="lineno"> 3965</span> <span class="preprocessor"> #include <thread></span></div> -<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l03750"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 3750</a></span> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div> +<div class="line"><a name="l03752"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 3752</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div> +<div class="line"><a name="l03754"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 3754</a></span>  VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div> +<div class="line"><a name="l03756"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 3756</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div> +<div class="line"><a name="l03758"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 3758</a></span>  uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div> +<div class="line"><a name="l03759"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403"> 3759</a></span> } <a class="code" href="vk__mem__alloc_8h.html#ad94034192259c2e34a4d1c5e27810403">VmaDefragmentationStats</a>;</div> +<div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>  </div> +<div class="line"><a name="l03790"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a"> 3790</a></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="l03791"></a><span class="lineno"> 3791</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* VMA_NOT_NULL pInfo,</div> +<div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pStats,</div> +<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE * VMA_NOT_NULL pContext);</div> +<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  </div> +<div class="line"><a name="l03801"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2"> 3801</a></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="l03802"></a><span class="lineno"> 3802</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context);</div> +<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>  </div> +<div class="line"><a name="l03805"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b"> 3805</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#ac0f01545b6262f7d4d128fc8f8e5c77b">vmaBeginDefragmentationPass</a>(</div> +<div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context,</div> +<div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>  <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* VMA_NOT_NULL pInfo</div> +<div class="line"><a name="l03809"></a><span class="lineno"> 3809</span> );</div> +<div class="line"><a name="l03810"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd"> 3810</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a1b9ffa538bed905af55c747cc48963bd">vmaEndDefragmentationPass</a>(</div> +<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> VMA_NULLABLE context</div> +<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span> );</div> +<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>  </div> +<div class="line"><a name="l03855"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac"> 3855</a></span> VMA_CALL_PRE VkResult VMA_CALL_POST <a class="code" href="vk__mem__alloc_8h.html#a9f0f8f56db5f7f57fe4454f465142dac">vmaDefragment</a>(</div> +<div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL * VMA_NOT_NULL VMA_LEN_IF_NOT_NULL(allocationCount) pAllocations,</div> +<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  VkBool32* VMA_NULLABLE VMA_LEN_IF_NOT_NULL(allocationCount) pAllocationsChanged,</div> +<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* VMA_NULLABLE pDefragmentationInfo,</div> +<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* VMA_NULLABLE pDefragmentationStats);</div> +<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>  </div> +<div class="line"><a name="l03875"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470"> 3875</a></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="l03876"></a><span class="lineno"> 3876</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer);</div> +<div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>  </div> +<div class="line"><a name="l03890"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a927c944f45e0f2941182abb6f608e64a"> 3890</a></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="l03891"></a><span class="lineno"> 3891</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  VkBuffer VMA_NOT_NULL_NON_DISPATCHABLE buffer,</div> +<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div> +<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  </div> +<div class="line"><a name="l03909"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5"> 3909</a></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="l03910"></a><span class="lineno"> 3910</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image);</div> +<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  </div> +<div class="line"><a name="l03924"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa8251ee81b0045a443e35b8e8aa021bc"> 3924</a></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="l03925"></a><span class="lineno"> 3925</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NOT_NULL allocation,</div> +<div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>  VkImage VMA_NOT_NULL_NON_DISPATCHABLE image,</div> +<div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* VMA_NULLABLE pNext);</div> +<div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>  </div> +<div class="line"><a name="l03961"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51"> 3961</a></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="l03962"></a><span class="lineno"> 3962</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>  <span class="keyword">const</span> VkBufferCreateInfo* VMA_NOT_NULL pBufferCreateInfo,</div> +<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> +<div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>  VkBuffer VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pBuffer,</div> +<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> +<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> <div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>  </div> -<div class="line"><a name="l03969"></a><span class="lineno"> 3969</span> <span class="comment">/*******************************************************************************</span></div> -<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span> <span class="comment">CONFIGURATION SECTION</span></div> -<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span> <span class="comment"></span> </div> -<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span> <span class="comment">Define some of these macros before each #include of this header or change them</span></div> -<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span> <span class="comment">here if you need other then default behavior depending on your environment.</span></div> -<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span> <span class="comment">*/</span></div> -<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>  </div> -<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span> <span class="comment">/*</span></div> -<div class="line"><a name="l03977"></a><span class="lineno"> 3977</span> <span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div> -<div class="line"><a name="l03978"></a><span class="lineno"> 3978</span> <span class="comment">internally, like:</span></div> -<div class="line"><a name="l03979"></a><span class="lineno"> 3979</span> <span class="comment"></span> </div> -<div class="line"><a name="l03980"></a><span class="lineno"> 3980</span> <span class="comment"> vulkanFunctions.vkAllocateMemory = &vkAllocateMemory;</span></div> -<div class="line"><a name="l03981"></a><span class="lineno"> 3981</span> <span class="comment">*/</span></div> -<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span> <span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) && !defined(VK_NO_PROTOTYPES)</span></div> -<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span> <span class="preprocessor"> #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div> -<div class="line"><a name="l03984"></a><span class="lineno"> 3984</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>  </div> -<div class="line"><a name="l03986"></a><span class="lineno"> 3986</span> <span class="comment">/*</span></div> -<div class="line"><a name="l03987"></a><span class="lineno"> 3987</span> <span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div> -<div class="line"><a name="l03988"></a><span class="lineno"> 3988</span> <span class="comment">internally, like:</span></div> -<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span> <span class="comment"></span> </div> -<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span> <span class="comment"> vulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(m_hDevice, vkAllocateMemory);</span></div> -<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span> <span class="comment">*/</span></div> -<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span> <span class="preprocessor">#if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)</span></div> -<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span> <span class="preprocessor"> #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</span></div> -<div class="line"><a name="l03994"></a><span class="lineno"> 3994</span> <span class="preprocessor"> #if defined(VK_NO_PROTOTYPES)</span></div> -<div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>  <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div> -<div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>  <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div> -<div class="line"><a name="l03997"></a><span class="lineno"> 3997</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l03998"></a><span class="lineno"> 3998</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>  </div> -<div class="line"><a name="l04000"></a><span class="lineno"> 4000</span> <span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div> -<div class="line"><a name="l04001"></a><span class="lineno"> 4001</span> <span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div> -<div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>  </div> -<div class="line"><a name="l04003"></a><span class="lineno"> 4003</span> <span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div> -<div class="line"><a name="l04004"></a><span class="lineno"> 4004</span> <span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div> -<div class="line"><a name="l04005"></a><span class="lineno"> 4005</span> <span class="comment"></span> </div> -<div class="line"><a name="l04006"></a><span class="lineno"> 4006</span> <span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div> -<div class="line"><a name="l04007"></a><span class="lineno"> 4007</span> <span class="comment">the containers.</span></div> -<div class="line"><a name="l04008"></a><span class="lineno"> 4008</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04009"></a><span class="lineno"> 4009</span> <span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div> -<div class="line"><a name="l04010"></a><span class="lineno"> 4010</span> <span class="preprocessor"> #define VMA_USE_STL_VECTOR 1</span></div> -<div class="line"><a name="l04011"></a><span class="lineno"> 4011</span> <span class="preprocessor"> #define VMA_USE_STL_UNORDERED_MAP 1</span></div> -<div class="line"><a name="l04012"></a><span class="lineno"> 4012</span> <span class="preprocessor"> #define VMA_USE_STL_LIST 1</span></div> -<div class="line"><a name="l04013"></a><span class="lineno"> 4013</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>  </div> -<div class="line"><a name="l04015"></a><span class="lineno"> 4015</span> <span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div> -<div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>  <span class="comment">// Compiler conforms to C++17.</span></div> -<div class="line"><a name="l04017"></a><span class="lineno"> 4017</span> <span class="preprocessor"> #if __cplusplus >= 201703L</span></div> -<div class="line"><a name="l04018"></a><span class="lineno"> 4018</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 1</span></div> -<div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>  <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div> -<div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>  <span class="comment">// Otherwise it's always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div> -<div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>  <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div> -<div class="line"><a name="l04022"></a><span class="lineno"> 4022</span> <span class="preprocessor"> #elif defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && __cplusplus == 199711L && _MSVC_LANG >= 201703L</span></div> -<div class="line"><a name="l04023"></a><span class="lineno"> 4023</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 1</span></div> -<div class="line"><a name="l04024"></a><span class="lineno"> 4024</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l04025"></a><span class="lineno"> 4025</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 0</span></div> -<div class="line"><a name="l04026"></a><span class="lineno"> 4026</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l04027"></a><span class="lineno"> 4027</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l03980"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77"> 3980</a></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="l03981"></a><span class="lineno"> 3981</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>  VkBuffer VMA_NULLABLE_NON_DISPATCHABLE buffer,</div> +<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> +<div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>  </div> +<div class="line"><a name="l03986"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73"> 3986</a></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="l03987"></a><span class="lineno"> 3987</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>  <span class="keyword">const</span> VkImageCreateInfo* VMA_NOT_NULL pImageCreateInfo,</div> +<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* VMA_NOT_NULL pAllocationCreateInfo,</div> +<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>  VkImage VMA_NULLABLE_NON_DISPATCHABLE * VMA_NOT_NULL pImage,</div> +<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE * VMA_NOT_NULL pAllocation,</div> +<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>  <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* VMA_NULLABLE pAllocationInfo);</div> +<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>  </div> +<div class="line"><a name="l04005"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e"> 4005</a></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="l04006"></a><span class="lineno"> 4006</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> VMA_NOT_NULL allocator,</div> +<div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>  VkImage VMA_NULLABLE_NON_DISPATCHABLE image,</div> +<div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> VMA_NULLABLE allocation);</div> +<div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>  </div> +<div class="line"><a name="l04010"></a><span class="lineno"> 4010</span> <span class="preprocessor">#ifdef __cplusplus</span></div> +<div class="line"><a name="l04011"></a><span class="lineno"> 4011</span> }</div> +<div class="line"><a name="l04012"></a><span class="lineno"> 4012</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>  </div> +<div class="line"><a name="l04014"></a><span class="lineno"> 4014</span> <span class="preprocessor">#endif </span><span class="comment">// AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div> +<div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>  </div> +<div class="line"><a name="l04016"></a><span class="lineno"> 4016</span> <span class="comment">// For Visual Studio IntelliSense.</span></div> +<div class="line"><a name="l04017"></a><span class="lineno"> 4017</span> <span class="preprocessor">#if defined(__cplusplus) && defined(__INTELLISENSE__)</span></div> +<div class="line"><a name="l04018"></a><span class="lineno"> 4018</span> <span class="preprocessor">#define VMA_IMPLEMENTATION</span></div> +<div class="line"><a name="l04019"></a><span class="lineno"> 4019</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>  </div> +<div class="line"><a name="l04021"></a><span class="lineno"> 4021</span> <span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div> +<div class="line"><a name="l04022"></a><span class="lineno"> 4022</span> <span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div> +<div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>  </div> +<div class="line"><a name="l04024"></a><span class="lineno"> 4024</span> <span class="preprocessor">#include <cstdint></span></div> +<div class="line"><a name="l04025"></a><span class="lineno"> 4025</span> <span class="preprocessor">#include <cstdlib></span></div> +<div class="line"><a name="l04026"></a><span class="lineno"> 4026</span> <span class="preprocessor">#include <cstring></span></div> +<div class="line"><a name="l04027"></a><span class="lineno"> 4027</span> <span class="preprocessor">#include <utility></span></div> <div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>  </div> -<div class="line"><a name="l04029"></a><span class="lineno"> 4029</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04030"></a><span class="lineno"> 4030</span> <span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div> -<div class="line"><a name="l04031"></a><span class="lineno"> 4031</span> <span class="comment">Library has its own container implementation.</span></div> -<div class="line"><a name="l04032"></a><span class="lineno"> 4032</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04033"></a><span class="lineno"> 4033</span> <span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div> -<div class="line"><a name="l04034"></a><span class="lineno"> 4034</span> <span class="preprocessor"> #include <vector></span></div> -<div class="line"><a name="l04035"></a><span class="lineno"> 4035</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>  </div> -<div class="line"><a name="l04037"></a><span class="lineno"> 4037</span> <span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div> -<div class="line"><a name="l04038"></a><span class="lineno"> 4038</span> <span class="preprocessor"> #include <unordered_map></span></div> -<div class="line"><a name="l04039"></a><span class="lineno"> 4039</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>  </div> -<div class="line"><a name="l04041"></a><span class="lineno"> 4041</span> <span class="preprocessor">#if VMA_USE_STL_LIST</span></div> -<div class="line"><a name="l04042"></a><span class="lineno"> 4042</span> <span class="preprocessor"> #include <list></span></div> -<div class="line"><a name="l04043"></a><span class="lineno"> 4043</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>  </div> -<div class="line"><a name="l04045"></a><span class="lineno"> 4045</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04046"></a><span class="lineno"> 4046</span> <span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div> -<div class="line"><a name="l04047"></a><span class="lineno"> 4047</span> <span class="comment">remove them if not needed.</span></div> -<div class="line"><a name="l04048"></a><span class="lineno"> 4048</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04049"></a><span class="lineno"> 4049</span> <span class="preprocessor">#include <cassert></span> <span class="comment">// for assert</span></div> -<div class="line"><a name="l04050"></a><span class="lineno"> 4050</span> <span class="preprocessor">#include <algorithm></span> <span class="comment">// for min, max</span></div> -<div class="line"><a name="l04051"></a><span class="lineno"> 4051</span> <span class="preprocessor">#include <mutex></span></div> -<div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>  </div> -<div class="line"><a name="l04053"></a><span class="lineno"> 4053</span> <span class="preprocessor">#ifndef VMA_NULL</span></div> -<div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>  <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div> -<div class="line"><a name="l04055"></a><span class="lineno"> 4055</span> <span class="preprocessor"> #define VMA_NULL nullptr</span></div> -<div class="line"><a name="l04056"></a><span class="lineno"> 4056</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>  </div> -<div class="line"><a name="l04058"></a><span class="lineno"> 4058</span> <span class="preprocessor">#if defined(__ANDROID_API__) && (__ANDROID_API__ < 16)</span></div> -<div class="line"><a name="l04059"></a><span class="lineno"> 4059</span> <span class="preprocessor">#include <cstdlib></span></div> -<div class="line"><a name="l04060"></a><span class="lineno"> 4060</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> -<div class="line"><a name="l04061"></a><span class="lineno"> 4061</span> {</div> -<div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>  <span class="comment">// alignment must be >= sizeof(void*)</span></div> -<div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>  <span class="keywordflow">if</span>(alignment < <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div> -<div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>  {</div> -<div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>  alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div> -<div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>  }</div> -<div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>  </div> -<div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>  <span class="keywordflow">return</span> memalign(alignment, size);</div> -<div class="line"><a name="l04069"></a><span class="lineno"> 4069</span> }</div> -<div class="line"><a name="l04070"></a><span class="lineno"> 4070</span> <span class="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))</span></div> -<div class="line"><a name="l04071"></a><span class="lineno"> 4071</span> <span class="preprocessor">#include <cstdlib></span></div> +<div class="line"><a name="l04029"></a><span class="lineno"> 4029</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l04030"></a><span class="lineno"> 4030</span> <span class="preprocessor"> #include <chrono></span></div> +<div class="line"><a name="l04031"></a><span class="lineno"> 4031</span> <span class="preprocessor"> #if defined(_WIN32)</span></div> +<div class="line"><a name="l04032"></a><span class="lineno"> 4032</span> <span class="preprocessor"> #include <windows.h></span></div> +<div class="line"><a name="l04033"></a><span class="lineno"> 4033</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04034"></a><span class="lineno"> 4034</span> <span class="preprocessor"> #include <sstream></span></div> +<div class="line"><a name="l04035"></a><span class="lineno"> 4035</span> <span class="preprocessor"> #include <thread></span></div> +<div class="line"><a name="l04036"></a><span class="lineno"> 4036</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04037"></a><span class="lineno"> 4037</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>  </div> +<div class="line"><a name="l04039"></a><span class="lineno"> 4039</span> <span class="comment">/*******************************************************************************</span></div> +<div class="line"><a name="l04040"></a><span class="lineno"> 4040</span> <span class="comment">CONFIGURATION SECTION</span></div> +<div class="line"><a name="l04041"></a><span class="lineno"> 4041</span> <span class="comment"></span> </div> +<div class="line"><a name="l04042"></a><span class="lineno"> 4042</span> <span class="comment">Define some of these macros before each #include of this header or change them</span></div> +<div class="line"><a name="l04043"></a><span class="lineno"> 4043</span> <span class="comment">here if you need other then default behavior depending on your environment.</span></div> +<div class="line"><a name="l04044"></a><span class="lineno"> 4044</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>  </div> +<div class="line"><a name="l04046"></a><span class="lineno"> 4046</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04047"></a><span class="lineno"> 4047</span> <span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div> +<div class="line"><a name="l04048"></a><span class="lineno"> 4048</span> <span class="comment">internally, like:</span></div> +<div class="line"><a name="l04049"></a><span class="lineno"> 4049</span> <span class="comment"></span> </div> +<div class="line"><a name="l04050"></a><span class="lineno"> 4050</span> <span class="comment"> vulkanFunctions.vkAllocateMemory = &vkAllocateMemory;</span></div> +<div class="line"><a name="l04051"></a><span class="lineno"> 4051</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04052"></a><span class="lineno"> 4052</span> <span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) && !defined(VK_NO_PROTOTYPES)</span></div> +<div class="line"><a name="l04053"></a><span class="lineno"> 4053</span> <span class="preprocessor"> #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div> +<div class="line"><a name="l04054"></a><span class="lineno"> 4054</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>  </div> +<div class="line"><a name="l04056"></a><span class="lineno"> 4056</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04057"></a><span class="lineno"> 4057</span> <span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div> +<div class="line"><a name="l04058"></a><span class="lineno"> 4058</span> <span class="comment">internally, like:</span></div> +<div class="line"><a name="l04059"></a><span class="lineno"> 4059</span> <span class="comment"></span> </div> +<div class="line"><a name="l04060"></a><span class="lineno"> 4060</span> <span class="comment"> vulkanFunctions.vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(m_hDevice, vkAllocateMemory);</span></div> +<div class="line"><a name="l04061"></a><span class="lineno"> 4061</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04062"></a><span class="lineno"> 4062</span> <span class="preprocessor">#if !defined(VMA_DYNAMIC_VULKAN_FUNCTIONS)</span></div> +<div class="line"><a name="l04063"></a><span class="lineno"> 4063</span> <span class="preprocessor"> #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1</span></div> +<div class="line"><a name="l04064"></a><span class="lineno"> 4064</span> <span class="preprocessor"> #if defined(VK_NO_PROTOTYPES)</span></div> +<div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>  <span class="keyword">extern</span> PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;</div> +<div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>  <span class="keyword">extern</span> PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;</div> +<div class="line"><a name="l04067"></a><span class="lineno"> 4067</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04068"></a><span class="lineno"> 4068</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>  </div> +<div class="line"><a name="l04070"></a><span class="lineno"> 4070</span> <span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div> +<div class="line"><a name="l04071"></a><span class="lineno"> 4071</span> <span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div> <div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>  </div> -<div class="line"><a name="l04073"></a><span class="lineno"> 4073</span> <span class="preprocessor">#if defined(__APPLE__)</span></div> -<div class="line"><a name="l04074"></a><span class="lineno"> 4074</span> <span class="preprocessor">#include <AvailabilityMacros.h></span></div> -<div class="line"><a name="l04075"></a><span class="lineno"> 4075</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>  </div> -<div class="line"><a name="l04077"></a><span class="lineno"> 4077</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> -<div class="line"><a name="l04078"></a><span class="lineno"> 4078</span> {</div> -<div class="line"><a name="l04079"></a><span class="lineno"> 4079</span> <span class="preprocessor">#if defined(__APPLE__) && (defined(MAC_OS_X_VERSION_10_16) || defined(__IPHONE_14_0))</span></div> -<div class="line"><a name="l04080"></a><span class="lineno"> 4080</span> <span class="preprocessor">#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_16 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0</span></div> -<div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>  <span class="comment">// For C++14, usr/include/malloc/_malloc.h declares aligned_alloc()) only</span></div> -<div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>  <span class="comment">// with the MacOSX11.0 SDK in Xcode 12 (which is what adds </span></div> -<div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>  <span class="comment">// MAC_OS_X_VERSION_10_16), even though the function is marked</span></div> -<div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>  <span class="comment">// availabe for 10.15. That's why the preprocessor checks for 10.16 but</span></div> -<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>  <span class="comment">// the __builtin_available checks for 10.15.</span></div> -<div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>  <span class="comment">// People who use C++17 could call aligned_alloc with the 10.15 SDK already.</span></div> -<div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>  <span class="keywordflow">if</span> (__builtin_available(macOS 10.15, iOS 13, *))</div> -<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>  <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div> -<div class="line"><a name="l04089"></a><span class="lineno"> 4089</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04090"></a><span class="lineno"> 4090</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>  <span class="comment">// alignment must be >= sizeof(void*)</span></div> -<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>  <span class="keywordflow">if</span>(alignment < <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div> -<div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>  {</div> -<div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>  alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div> -<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>  }</div> -<div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>  </div> -<div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>  <span class="keywordtype">void</span> *pointer;</div> -<div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>  <span class="keywordflow">if</span>(posix_memalign(&pointer, alignment, size) == 0)</div> -<div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>  <span class="keywordflow">return</span> pointer;</div> -<div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>  <span class="keywordflow">return</span> VMA_NULL;</div> -<div class="line"><a name="l04101"></a><span class="lineno"> 4101</span> }</div> -<div class="line"><a name="l04102"></a><span class="lineno"> 4102</span> <span class="preprocessor">#elif defined(_WIN32)</span></div> -<div class="line"><a name="l04103"></a><span class="lineno"> 4103</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> -<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span> {</div> -<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>  <span class="keywordflow">return</span> _aligned_malloc(size, alignment);</div> -<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span> }</div> -<div class="line"><a name="l04107"></a><span class="lineno"> 4107</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l04108"></a><span class="lineno"> 4108</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> -<div class="line"><a name="l04109"></a><span class="lineno"> 4109</span> {</div> -<div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>  <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div> -<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span> }</div> -<div class="line"><a name="l04112"></a><span class="lineno"> 4112</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>  </div> -<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span> <span class="preprocessor">#if defined(_WIN32)</span></div> -<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span> {</div> -<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>  _aligned_free(ptr);</div> -<div class="line"><a name="l04118"></a><span class="lineno"> 4118</span> }</div> -<div class="line"><a name="l04119"></a><span class="lineno"> 4119</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l04120"></a><span class="lineno"> 4120</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l04121"></a><span class="lineno"> 4121</span> {</div> -<div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>  free(ptr);</div> -<div class="line"><a name="l04123"></a><span class="lineno"> 4123</span> }</div> -<div class="line"><a name="l04124"></a><span class="lineno"> 4124</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>  </div> -<div class="line"><a name="l04126"></a><span class="lineno"> 4126</span> <span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div> -<div class="line"><a name="l04127"></a><span class="lineno"> 4127</span> <span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div> -<div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>  </div> -<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span> <span class="comment">//#include <malloc.h></span></div> -<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>  </div> -<div class="line"><a name="l04131"></a><span class="lineno"> 4131</span> <span class="comment">// Normal assert to check for programmer's errors, especially in Debug configuration.</span></div> -<div class="line"><a name="l04132"></a><span class="lineno"> 4132</span> <span class="preprocessor">#ifndef VMA_ASSERT</span></div> -<div class="line"><a name="l04133"></a><span class="lineno"> 4133</span> <span class="preprocessor"> #ifdef NDEBUG</span></div> -<div class="line"><a name="l04134"></a><span class="lineno"> 4134</span> <span class="preprocessor"> #define VMA_ASSERT(expr)</span></div> -<div class="line"><a name="l04135"></a><span class="lineno"> 4135</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l04136"></a><span class="lineno"> 4136</span> <span class="preprocessor"> #define VMA_ASSERT(expr) assert(expr)</span></div> -<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>  </div> -<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span> <span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div> -<div class="line"><a name="l04141"></a><span class="lineno"> 4141</span> <span class="comment">// Making it non-empty can make program slow.</span></div> -<div class="line"><a name="l04142"></a><span class="lineno"> 4142</span> <span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div> -<div class="line"><a name="l04143"></a><span class="lineno"> 4143</span> <span class="preprocessor"> #ifdef NDEBUG</span></div> -<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span> <span class="preprocessor"> #define VMA_HEAVY_ASSERT(expr)</span></div> -<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span> <span class="preprocessor"> #define VMA_HEAVY_ASSERT(expr) //VMA_ASSERT(expr)</span></div> -<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>  </div> -<div class="line"><a name="l04150"></a><span class="lineno"> 4150</span> <span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div> -<div class="line"><a name="l04151"></a><span class="lineno"> 4151</span> <span class="preprocessor"> #define VMA_ALIGN_OF(type) (__alignof(type))</span></div> -<div class="line"><a name="l04152"></a><span class="lineno"> 4152</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>  </div> -<div class="line"><a name="l04154"></a><span class="lineno"> 4154</span> <span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div> -<div class="line"><a name="l04155"></a><span class="lineno"> 4155</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) vma_aligned_alloc((alignment), (size))</span></div> -<div class="line"><a name="l04156"></a><span class="lineno"> 4156</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>  </div> -<div class="line"><a name="l04158"></a><span class="lineno"> 4158</span> <span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_FREE</span></div> -<div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>  <span class="comment">// VMA_SYSTEM_FREE is the old name, but might have been defined by the user</span></div> -<div class="line"><a name="l04160"></a><span class="lineno"> 4160</span> <span class="preprocessor"> #if defined(VMA_SYSTEM_FREE)</span></div> -<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_FREE(ptr) VMA_SYSTEM_FREE(ptr)</span></div> -<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_FREE(ptr) vma_aligned_free(ptr)</span></div> -<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l04165"></a><span class="lineno"> 4165</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04073"></a><span class="lineno"> 4073</span> <span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div> +<div class="line"><a name="l04074"></a><span class="lineno"> 4074</span> <span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div> +<div class="line"><a name="l04075"></a><span class="lineno"> 4075</span> <span class="comment"></span> </div> +<div class="line"><a name="l04076"></a><span class="lineno"> 4076</span> <span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div> +<div class="line"><a name="l04077"></a><span class="lineno"> 4077</span> <span class="comment">the containers.</span></div> +<div class="line"><a name="l04078"></a><span class="lineno"> 4078</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04079"></a><span class="lineno"> 4079</span> <span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div> +<div class="line"><a name="l04080"></a><span class="lineno"> 4080</span> <span class="preprocessor"> #define VMA_USE_STL_VECTOR 1</span></div> +<div class="line"><a name="l04081"></a><span class="lineno"> 4081</span> <span class="preprocessor"> #define VMA_USE_STL_UNORDERED_MAP 1</span></div> +<div class="line"><a name="l04082"></a><span class="lineno"> 4082</span> <span class="preprocessor"> #define VMA_USE_STL_LIST 1</span></div> +<div class="line"><a name="l04083"></a><span class="lineno"> 4083</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>  </div> +<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span> <span class="preprocessor">#ifndef VMA_USE_STL_SHARED_MUTEX</span></div> +<div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>  <span class="comment">// Compiler conforms to C++17.</span></div> +<div class="line"><a name="l04087"></a><span class="lineno"> 4087</span> <span class="preprocessor"> #if __cplusplus >= 201703L</span></div> +<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 1</span></div> +<div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>  <span class="comment">// Visual studio defines __cplusplus properly only when passed additional parameter: /Zc:__cplusplus</span></div> +<div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>  <span class="comment">// Otherwise it's always 199711L, despite shared_mutex works since Visual Studio 2015 Update 2.</span></div> +<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>  <span class="comment">// See: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/</span></div> +<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span> <span class="preprocessor"> #elif defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && __cplusplus == 199711L && _MSVC_LANG >= 201703L</span></div> +<div class="line"><a name="l04093"></a><span class="lineno"> 4093</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 1</span></div> +<div class="line"><a name="l04094"></a><span class="lineno"> 4094</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span> <span class="preprocessor"> #define VMA_USE_STL_SHARED_MUTEX 0</span></div> +<div class="line"><a name="l04096"></a><span class="lineno"> 4096</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04097"></a><span class="lineno"> 4097</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>  </div> +<div class="line"><a name="l04099"></a><span class="lineno"> 4099</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04100"></a><span class="lineno"> 4100</span> <span class="comment">THESE INCLUDES ARE NOT ENABLED BY DEFAULT.</span></div> +<div class="line"><a name="l04101"></a><span class="lineno"> 4101</span> <span class="comment">Library has its own container implementation.</span></div> +<div class="line"><a name="l04102"></a><span class="lineno"> 4102</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04103"></a><span class="lineno"> 4103</span> <span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div> +<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span> <span class="preprocessor"> #include <vector></span></div> +<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>  </div> +<div class="line"><a name="l04107"></a><span class="lineno"> 4107</span> <span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div> +<div class="line"><a name="l04108"></a><span class="lineno"> 4108</span> <span class="preprocessor"> #include <unordered_map></span></div> +<div class="line"><a name="l04109"></a><span class="lineno"> 4109</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>  </div> +<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span> <span class="preprocessor">#if VMA_USE_STL_LIST</span></div> +<div class="line"><a name="l04112"></a><span class="lineno"> 4112</span> <span class="preprocessor"> #include <list></span></div> +<div class="line"><a name="l04113"></a><span class="lineno"> 4113</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>  </div> +<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span> <span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div> +<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span> <span class="comment">remove them if not needed.</span></div> +<div class="line"><a name="l04118"></a><span class="lineno"> 4118</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04119"></a><span class="lineno"> 4119</span> <span class="preprocessor">#include <cassert></span> <span class="comment">// for assert</span></div> +<div class="line"><a name="l04120"></a><span class="lineno"> 4120</span> <span class="preprocessor">#include <algorithm></span> <span class="comment">// for min, max</span></div> +<div class="line"><a name="l04121"></a><span class="lineno"> 4121</span> <span class="preprocessor">#include <mutex></span></div> +<div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>  </div> +<div class="line"><a name="l04123"></a><span class="lineno"> 4123</span> <span class="preprocessor">#ifndef VMA_NULL</span></div> +<div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>  <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div> +<div class="line"><a name="l04125"></a><span class="lineno"> 4125</span> <span class="preprocessor"> #define VMA_NULL nullptr</span></div> +<div class="line"><a name="l04126"></a><span class="lineno"> 4126</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>  </div> +<div class="line"><a name="l04128"></a><span class="lineno"> 4128</span> <span class="preprocessor">#if defined(__ANDROID_API__) && (__ANDROID_API__ < 16)</span></div> +<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span> <span class="preprocessor">#include <cstdlib></span></div> +<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> +<div class="line"><a name="l04131"></a><span class="lineno"> 4131</span> {</div> +<div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>  <span class="comment">// alignment must be >= sizeof(void*)</span></div> +<div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>  <span class="keywordflow">if</span>(alignment < <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div> +<div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>  {</div> +<div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>  alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div> +<div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>  }</div> +<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>  </div> +<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>  <span class="keywordflow">return</span> memalign(alignment, size);</div> +<div class="line"><a name="l04139"></a><span class="lineno"> 4139</span> }</div> +<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span> <span class="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__) || (defined(__linux__) && defined(__GLIBCXX__) && !defined(_GLIBCXX_HAVE_ALIGNED_ALLOC))</span></div> +<div class="line"><a name="l04141"></a><span class="lineno"> 4141</span> <span class="preprocessor">#include <cstdlib></span></div> +<div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>  </div> +<div class="line"><a name="l04143"></a><span class="lineno"> 4143</span> <span class="preprocessor">#if defined(__APPLE__)</span></div> +<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span> <span class="preprocessor">#include <AvailabilityMacros.h></span></div> +<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>  </div> +<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> +<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span> {</div> +<div class="line"><a name="l04149"></a><span class="lineno"> 4149</span> <span class="preprocessor">#if defined(__APPLE__) && (defined(MAC_OS_X_VERSION_10_16) || defined(__IPHONE_14_0))</span></div> +<div class="line"><a name="l04150"></a><span class="lineno"> 4150</span> <span class="preprocessor">#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_16 || __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_14_0</span></div> +<div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>  <span class="comment">// For C++14, usr/include/malloc/_malloc.h declares aligned_alloc()) only</span></div> +<div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>  <span class="comment">// with the MacOSX11.0 SDK in Xcode 12 (which is what adds</span></div> +<div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>  <span class="comment">// MAC_OS_X_VERSION_10_16), even though the function is marked</span></div> +<div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>  <span class="comment">// availabe for 10.15. That's why the preprocessor checks for 10.16 but</span></div> +<div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>  <span class="comment">// the __builtin_available checks for 10.15.</span></div> +<div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>  <span class="comment">// People who use C++17 could call aligned_alloc with the 10.15 SDK already.</span></div> +<div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>  <span class="keywordflow">if</span> (__builtin_available(macOS 10.15, iOS 13, *))</div> +<div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>  <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div> +<div class="line"><a name="l04159"></a><span class="lineno"> 4159</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04160"></a><span class="lineno"> 4160</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>  <span class="comment">// alignment must be >= sizeof(void*)</span></div> +<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>  <span class="keywordflow">if</span>(alignment < <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div> +<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>  {</div> +<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>  alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div> +<div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>  }</div> <div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>  </div> -<div class="line"><a name="l04167"></a><span class="lineno"> 4167</span> <span class="preprocessor">#ifndef VMA_MIN</span></div> -<div class="line"><a name="l04168"></a><span class="lineno"> 4168</span> <span class="preprocessor"> #define VMA_MIN(v1, v2) (std::min((v1), (v2)))</span></div> -<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>  </div> -<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span> <span class="preprocessor">#ifndef VMA_MAX</span></div> -<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span> <span class="preprocessor"> #define VMA_MAX(v1, v2) (std::max((v1), (v2)))</span></div> -<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>  </div> -<div class="line"><a name="l04175"></a><span class="lineno"> 4175</span> <span class="preprocessor">#ifndef VMA_SWAP</span></div> -<div class="line"><a name="l04176"></a><span class="lineno"> 4176</span> <span class="preprocessor"> #define VMA_SWAP(v1, v2) std::swap((v1), (v2))</span></div> -<div class="line"><a name="l04177"></a><span class="lineno"> 4177</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>  </div> -<div class="line"><a name="l04179"></a><span class="lineno"> 4179</span> <span class="preprocessor">#ifndef VMA_SORT</span></div> -<div class="line"><a name="l04180"></a><span class="lineno"> 4180</span> <span class="preprocessor"> #define VMA_SORT(beg, end, cmp) std::sort(beg, end, cmp)</span></div> -<div class="line"><a name="l04181"></a><span class="lineno"> 4181</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>  </div> -<div class="line"><a name="l04183"></a><span class="lineno"> 4183</span> <span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div> -<div class="line"><a name="l04184"></a><span class="lineno"> 4184</span> <span class="preprocessor"> #define VMA_DEBUG_LOG(format, ...)</span></div> -<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span> <span class="comment"> #define VMA_DEBUG_LOG(format, ...) do { \</span></div> -<div class="line"><a name="l04187"></a><span class="lineno"> 4187</span> <span class="comment"> printf(format, __VA_ARGS__); \</span></div> -<div class="line"><a name="l04188"></a><span class="lineno"> 4188</span> <span class="comment"> printf("\n"); \</span></div> -<div class="line"><a name="l04189"></a><span class="lineno"> 4189</span> <span class="comment"> } while(false)</span></div> -<div class="line"><a name="l04190"></a><span class="lineno"> 4190</span> <span class="comment"> */</span></div> -<div class="line"><a name="l04191"></a><span class="lineno"> 4191</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>  </div> -<div class="line"><a name="l04193"></a><span class="lineno"> 4193</span> <span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div> -<div class="line"><a name="l04194"></a><span class="lineno"> 4194</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div> -<div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>  {</div> -<div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>  snprintf(outStr, strLen, <span class="stringliteral">"%u"</span>, <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">></span>(num));</div> -<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>  }</div> -<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div> -<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>  {</div> -<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>  snprintf(outStr, strLen, <span class="stringliteral">"%llu"</span>, <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span><span class="keyword">></span>(num));</div> -<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>  }</div> -<div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>  {</div> -<div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>  snprintf(outStr, strLen, <span class="stringliteral">"%p"</span>, ptr);</div> -<div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>  }</div> -<div class="line"><a name="l04207"></a><span class="lineno"> 4207</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>  </div> -<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span> <span class="preprocessor">#ifndef VMA_MUTEX</span></div> -<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>  <span class="keyword">class </span>VmaMutex</div> -<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>  {</div> -<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>  <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div> -<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>  <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div> -<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>  <span class="keywordtype">bool</span> TryLock() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div> -<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>  std::mutex m_Mutex;</div> -<div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>  };</div> -<div class="line"><a name="l04219"></a><span class="lineno"> 4219</span> <span class="preprocessor"> #define VMA_MUTEX VmaMutex</span></div> -<div class="line"><a name="l04220"></a><span class="lineno"> 4220</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>  </div> -<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span> <span class="comment">// Read-write mutex, where "read" is shared access, "write" is exclusive access.</span></div> -<div class="line"><a name="l04223"></a><span class="lineno"> 4223</span> <span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div> -<div class="line"><a name="l04224"></a><span class="lineno"> 4224</span> <span class="preprocessor"> #if VMA_USE_STL_SHARED_MUTEX</span></div> -<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>  <span class="comment">// Use std::shared_mutex from C++17.</span></div> -<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span> <span class="preprocessor"> #include <shared_mutex></span></div> -<div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>  <span class="keyword">class </span>VmaRWMutex</div> -<div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>  {</div> -<div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>  <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div> -<div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>  <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div> -<div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.try_lock_shared(); }</div> -<div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>  <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div> -<div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>  <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div> -<div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div> -<div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>  std::shared_mutex m_Mutex;</div> -<div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>  };</div> -<div class="line"><a name="l04239"></a><span class="lineno"> 4239</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> -<div class="line"><a name="l04240"></a><span class="lineno"> 4240</span> <span class="preprocessor"> #elif defined(_WIN32) && defined(WINVER) && WINVER >= 0x0600</span></div> -<div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>  <span class="comment">// Use SRWLOCK from WinAPI.</span></div> -<div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>  <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div> -<div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>  <span class="keyword">class </span>VmaRWMutex</div> -<div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>  {</div> -<div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>  VmaRWMutex() { InitializeSRWLock(&m_Lock); }</div> -<div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>  <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&m_Lock); }</div> -<div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>  <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&m_Lock); }</div> -<div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> TryAcquireSRWLockShared(&m_Lock) != FALSE; }</div> -<div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>  <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&m_Lock); }</div> -<div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>  <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&m_Lock); }</div> -<div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> TryAcquireSRWLockExclusive(&m_Lock) != FALSE; }</div> -<div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>  SRWLOCK m_Lock;</div> -<div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>  };</div> -<div class="line"><a name="l04256"></a><span class="lineno"> 4256</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> -<div class="line"><a name="l04257"></a><span class="lineno"> 4257</span> <span class="preprocessor"> #else</span></div> -<div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>  <span class="comment">// Less efficient fallback: Use normal mutex.</span></div> -<div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>  <span class="keyword">class </span>VmaRWMutex</div> -<div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>  {</div> -<div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>  <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div> -<div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>  <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div> -<div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div> -<div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>  <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div> -<div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>  <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div> -<div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div> -<div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>  VMA_MUTEX m_Mutex;</div> -<div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>  };</div> -<div class="line"><a name="l04271"></a><span class="lineno"> 4271</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> -<div class="line"><a name="l04272"></a><span class="lineno"> 4272</span> <span class="preprocessor"> #endif // #if VMA_USE_STL_SHARED_MUTEX</span></div> -<div class="line"><a name="l04273"></a><span class="lineno"> 4273</span> <span class="preprocessor">#endif // #ifndef VMA_RW_MUTEX</span></div> -<div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>  </div> -<div class="line"><a name="l04275"></a><span class="lineno"> 4275</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04276"></a><span class="lineno"> 4276</span> <span class="comment">If providing your own implementation, you need to implement a subset of std::atomic.</span></div> -<div class="line"><a name="l04277"></a><span class="lineno"> 4277</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04278"></a><span class="lineno"> 4278</span> <span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div> -<div class="line"><a name="l04279"></a><span class="lineno"> 4279</span> <span class="preprocessor"> #include <atomic></span></div> -<div class="line"><a name="l04280"></a><span class="lineno"> 4280</span> <span class="preprocessor"> #define VMA_ATOMIC_UINT32 std::atomic<uint32_t></span></div> -<div class="line"><a name="l04281"></a><span class="lineno"> 4281</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>  </div> -<div class="line"><a name="l04283"></a><span class="lineno"> 4283</span> <span class="preprocessor">#ifndef VMA_ATOMIC_UINT64</span></div> -<div class="line"><a name="l04284"></a><span class="lineno"> 4284</span> <span class="preprocessor"> #include <atomic></span></div> -<div class="line"><a name="l04285"></a><span class="lineno"> 4285</span> <span class="preprocessor"> #define VMA_ATOMIC_UINT64 std::atomic<uint64_t></span></div> -<div class="line"><a name="l04286"></a><span class="lineno"> 4286</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>  </div> -<div class="line"><a name="l04288"></a><span class="lineno"> 4288</span> <span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div> -<div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>  </div> -<div class="line"><a name="l04293"></a><span class="lineno"> 4293</span> <span class="preprocessor"> #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div> -<div class="line"><a name="l04294"></a><span class="lineno"> 4294</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>  </div> -<div class="line"><a name="l04296"></a><span class="lineno"> 4296</span> <span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div> -<div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>  </div> -<div class="line"><a name="l04301"></a><span class="lineno"> 4301</span> <span class="preprocessor"> #define VMA_DEBUG_ALIGNMENT (1)</span></div> -<div class="line"><a name="l04302"></a><span class="lineno"> 4302</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>  </div> -<div class="line"><a name="l04304"></a><span class="lineno"> 4304</span> <span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div> -<div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>  </div> -<div class="line"><a name="l04309"></a><span class="lineno"> 4309</span> <span class="preprocessor"> #define VMA_DEBUG_MARGIN (0)</span></div> -<div class="line"><a name="l04310"></a><span class="lineno"> 4310</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>  </div> -<div class="line"><a name="l04312"></a><span class="lineno"> 4312</span> <span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div> -<div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>  </div> -<div class="line"><a name="l04317"></a><span class="lineno"> 4317</span> <span class="preprocessor"> #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div> -<div class="line"><a name="l04318"></a><span class="lineno"> 4318</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>  </div> -<div class="line"><a name="l04320"></a><span class="lineno"> 4320</span> <span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div> -<div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>  </div> -<div class="line"><a name="l04326"></a><span class="lineno"> 4326</span> <span class="preprocessor"> #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div> -<div class="line"><a name="l04327"></a><span class="lineno"> 4327</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>  </div> -<div class="line"><a name="l04329"></a><span class="lineno"> 4329</span> <span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div> -<div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>  </div> -<div class="line"><a name="l04334"></a><span class="lineno"> 4334</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div> -<div class="line"><a name="l04335"></a><span class="lineno"> 4335</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>  </div> -<div class="line"><a name="l04337"></a><span class="lineno"> 4337</span> <span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div> -<div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>  </div> -<div class="line"><a name="l04342"></a><span class="lineno"> 4342</span> <span class="preprocessor"> #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div> -<div class="line"><a name="l04343"></a><span class="lineno"> 4343</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>  <span class="keywordtype">void</span> *pointer;</div> +<div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>  <span class="keywordflow">if</span>(posix_memalign(&pointer, alignment, size) == 0)</div> +<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>  <span class="keywordflow">return</span> pointer;</div> +<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>  <span class="keywordflow">return</span> VMA_NULL;</div> +<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span> }</div> +<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span> <span class="preprocessor">#elif defined(_WIN32)</span></div> +<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> +<div class="line"><a name="l04174"></a><span class="lineno"> 4174</span> {</div> +<div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>  <span class="keywordflow">return</span> _aligned_malloc(size, alignment);</div> +<div class="line"><a name="l04176"></a><span class="lineno"> 4176</span> }</div> +<div class="line"><a name="l04177"></a><span class="lineno"> 4177</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* vma_aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div> +<div class="line"><a name="l04179"></a><span class="lineno"> 4179</span> {</div> +<div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>  <span class="keywordflow">return</span> aligned_alloc(alignment, size);</div> +<div class="line"><a name="l04181"></a><span class="lineno"> 4181</span> }</div> +<div class="line"><a name="l04182"></a><span class="lineno"> 4182</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>  </div> +<div class="line"><a name="l04184"></a><span class="lineno"> 4184</span> <span class="preprocessor">#if defined(_WIN32)</span></div> +<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span> {</div> +<div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>  _aligned_free(ptr);</div> +<div class="line"><a name="l04188"></a><span class="lineno"> 4188</span> }</div> +<div class="line"><a name="l04189"></a><span class="lineno"> 4189</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l04190"></a><span class="lineno"> 4190</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_aligned_free(<span class="keywordtype">void</span>* VMA_NULLABLE ptr)</div> +<div class="line"><a name="l04191"></a><span class="lineno"> 4191</span> {</div> +<div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>  free(ptr);</div> +<div class="line"><a name="l04193"></a><span class="lineno"> 4193</span> }</div> +<div class="line"><a name="l04194"></a><span class="lineno"> 4194</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>  </div> +<div class="line"><a name="l04196"></a><span class="lineno"> 4196</span> <span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div> +<div class="line"><a name="l04197"></a><span class="lineno"> 4197</span> <span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div> +<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>  </div> +<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span> <span class="comment">//#include <malloc.h></span></div> +<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>  </div> +<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span> <span class="comment">// Normal assert to check for programmer's errors, especially in Debug configuration.</span></div> +<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span> <span class="preprocessor">#ifndef VMA_ASSERT</span></div> +<div class="line"><a name="l04203"></a><span class="lineno"> 4203</span> <span class="preprocessor"> #ifdef NDEBUG</span></div> +<div class="line"><a name="l04204"></a><span class="lineno"> 4204</span> <span class="preprocessor"> #define VMA_ASSERT(expr)</span></div> +<div class="line"><a name="l04205"></a><span class="lineno"> 4205</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04206"></a><span class="lineno"> 4206</span> <span class="preprocessor"> #define VMA_ASSERT(expr) assert(expr)</span></div> +<div class="line"><a name="l04207"></a><span class="lineno"> 4207</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>  </div> +<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span> <span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div> +<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span> <span class="comment">// Making it non-empty can make program slow.</span></div> +<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span> <span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div> +<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span> <span class="preprocessor"> #ifdef NDEBUG</span></div> +<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span> <span class="preprocessor"> #define VMA_HEAVY_ASSERT(expr)</span></div> +<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span> <span class="preprocessor"> #define VMA_HEAVY_ASSERT(expr) </span><span class="comment">//VMA_ASSERT(expr)</span></div> +<div class="line"><a name="l04217"></a><span class="lineno"> 4217</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04218"></a><span class="lineno"> 4218</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>  </div> +<div class="line"><a name="l04220"></a><span class="lineno"> 4220</span> <span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div> +<div class="line"><a name="l04221"></a><span class="lineno"> 4221</span> <span class="preprocessor"> #define VMA_ALIGN_OF(type) (__alignof(type))</span></div> +<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>  </div> +<div class="line"><a name="l04224"></a><span class="lineno"> 4224</span> <span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div> +<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment) vma_aligned_alloc((alignment), (size))</span></div> +<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>  </div> +<div class="line"><a name="l04228"></a><span class="lineno"> 4228</span> <span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_FREE</span></div> +<div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>  <span class="comment">// VMA_SYSTEM_FREE is the old name, but might have been defined by the user</span></div> +<div class="line"><a name="l04230"></a><span class="lineno"> 4230</span> <span class="preprocessor"> #if defined(VMA_SYSTEM_FREE)</span></div> +<div class="line"><a name="l04231"></a><span class="lineno"> 4231</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_FREE(ptr) VMA_SYSTEM_FREE(ptr)</span></div> +<div class="line"><a name="l04232"></a><span class="lineno"> 4232</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04233"></a><span class="lineno"> 4233</span> <span class="preprocessor"> #define VMA_SYSTEM_ALIGNED_FREE(ptr) vma_aligned_free(ptr)</span></div> +<div class="line"><a name="l04234"></a><span class="lineno"> 4234</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04235"></a><span class="lineno"> 4235</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>  </div> +<div class="line"><a name="l04237"></a><span class="lineno"> 4237</span> <span class="preprocessor">#ifndef VMA_MIN</span></div> +<div class="line"><a name="l04238"></a><span class="lineno"> 4238</span> <span class="preprocessor"> #define VMA_MIN(v1, v2) (std::min((v1), (v2)))</span></div> +<div class="line"><a name="l04239"></a><span class="lineno"> 4239</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>  </div> +<div class="line"><a name="l04241"></a><span class="lineno"> 4241</span> <span class="preprocessor">#ifndef VMA_MAX</span></div> +<div class="line"><a name="l04242"></a><span class="lineno"> 4242</span> <span class="preprocessor"> #define VMA_MAX(v1, v2) (std::max((v1), (v2)))</span></div> +<div class="line"><a name="l04243"></a><span class="lineno"> 4243</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>  </div> +<div class="line"><a name="l04245"></a><span class="lineno"> 4245</span> <span class="preprocessor">#ifndef VMA_SWAP</span></div> +<div class="line"><a name="l04246"></a><span class="lineno"> 4246</span> <span class="preprocessor"> #define VMA_SWAP(v1, v2) std::swap((v1), (v2))</span></div> +<div class="line"><a name="l04247"></a><span class="lineno"> 4247</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>  </div> +<div class="line"><a name="l04249"></a><span class="lineno"> 4249</span> <span class="preprocessor">#ifndef VMA_SORT</span></div> +<div class="line"><a name="l04250"></a><span class="lineno"> 4250</span> <span class="preprocessor"> #define VMA_SORT(beg, end, cmp) std::sort(beg, end, cmp)</span></div> +<div class="line"><a name="l04251"></a><span class="lineno"> 4251</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>  </div> +<div class="line"><a name="l04253"></a><span class="lineno"> 4253</span> <span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div> +<div class="line"><a name="l04254"></a><span class="lineno"> 4254</span> <span class="preprocessor"> #define VMA_DEBUG_LOG(format, ...)</span></div> +<div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l04256"></a><span class="lineno"> 4256</span> <span class="comment"> #define VMA_DEBUG_LOG(format, ...) do { \</span></div> +<div class="line"><a name="l04257"></a><span class="lineno"> 4257</span> <span class="comment"> printf(format, __VA_ARGS__); \</span></div> +<div class="line"><a name="l04258"></a><span class="lineno"> 4258</span> <span class="comment"> printf("\n"); \</span></div> +<div class="line"><a name="l04259"></a><span class="lineno"> 4259</span> <span class="comment"> } while(false)</span></div> +<div class="line"><a name="l04260"></a><span class="lineno"> 4260</span> <span class="comment"> */</span></div> +<div class="line"><a name="l04261"></a><span class="lineno"> 4261</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>  </div> +<div class="line"><a name="l04263"></a><span class="lineno"> 4263</span> <span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div> +<div class="line"><a name="l04264"></a><span class="lineno"> 4264</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div> +<div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>  {</div> +<div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>  snprintf(outStr, strLen, <span class="stringliteral">"%u"</span>, <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">></span>(num));</div> +<div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>  }</div> +<div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div> +<div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>  {</div> +<div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>  snprintf(outStr, strLen, <span class="stringliteral">"%llu"</span>, <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span><span class="keyword">></span>(num));</div> +<div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>  }</div> +<div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* VMA_NOT_NULL outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>  {</div> +<div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>  snprintf(outStr, strLen, <span class="stringliteral">"%p"</span>, ptr);</div> +<div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>  }</div> +<div class="line"><a name="l04277"></a><span class="lineno"> 4277</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>  </div> +<div class="line"><a name="l04279"></a><span class="lineno"> 4279</span> <span class="preprocessor">#ifndef VMA_MUTEX</span></div> +<div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>  <span class="keyword">class </span>VmaMutex</div> +<div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>  {</div> +<div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>  <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div> +<div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>  <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div> +<div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>  <span class="keywordtype">bool</span> TryLock() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div> +<div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>  std::mutex m_Mutex;</div> +<div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>  };</div> +<div class="line"><a name="l04289"></a><span class="lineno"> 4289</span> <span class="preprocessor"> #define VMA_MUTEX VmaMutex</span></div> +<div class="line"><a name="l04290"></a><span class="lineno"> 4290</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>  </div> +<div class="line"><a name="l04292"></a><span class="lineno"> 4292</span> <span class="comment">// Read-write mutex, where "read" is shared access, "write" is exclusive access.</span></div> +<div class="line"><a name="l04293"></a><span class="lineno"> 4293</span> <span class="preprocessor">#ifndef VMA_RW_MUTEX</span></div> +<div class="line"><a name="l04294"></a><span class="lineno"> 4294</span> <span class="preprocessor"> #if VMA_USE_STL_SHARED_MUTEX</span></div> +<div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>  <span class="comment">// Use std::shared_mutex from C++17.</span></div> +<div class="line"><a name="l04296"></a><span class="lineno"> 4296</span> <span class="preprocessor"> #include <shared_mutex></span></div> +<div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>  <span class="keyword">class </span>VmaRWMutex</div> +<div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>  {</div> +<div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>  <span class="keywordtype">void</span> LockRead() { m_Mutex.lock_shared(); }</div> +<div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>  <span class="keywordtype">void</span> UnlockRead() { m_Mutex.unlock_shared(); }</div> +<div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.try_lock_shared(); }</div> +<div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>  <span class="keywordtype">void</span> LockWrite() { m_Mutex.lock(); }</div> +<div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>  <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.unlock(); }</div> +<div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.try_lock(); }</div> +<div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>  std::shared_mutex m_Mutex;</div> +<div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>  };</div> +<div class="line"><a name="l04309"></a><span class="lineno"> 4309</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> +<div class="line"><a name="l04310"></a><span class="lineno"> 4310</span> <span class="preprocessor"> #elif defined(_WIN32) && defined(WINVER) && WINVER >= 0x0600</span></div> +<div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>  <span class="comment">// Use SRWLOCK from WinAPI.</span></div> +<div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>  <span class="comment">// Minimum supported client = Windows Vista, server = Windows Server 2008.</span></div> +<div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>  <span class="keyword">class </span>VmaRWMutex</div> +<div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>  {</div> +<div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>  VmaRWMutex() { InitializeSRWLock(&m_Lock); }</div> +<div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>  <span class="keywordtype">void</span> LockRead() { AcquireSRWLockShared(&m_Lock); }</div> +<div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>  <span class="keywordtype">void</span> UnlockRead() { ReleaseSRWLockShared(&m_Lock); }</div> +<div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> TryAcquireSRWLockShared(&m_Lock) != FALSE; }</div> +<div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>  <span class="keywordtype">void</span> LockWrite() { AcquireSRWLockExclusive(&m_Lock); }</div> +<div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>  <span class="keywordtype">void</span> UnlockWrite() { ReleaseSRWLockExclusive(&m_Lock); }</div> +<div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> TryAcquireSRWLockExclusive(&m_Lock) != FALSE; }</div> +<div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>  SRWLOCK m_Lock;</div> +<div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>  };</div> +<div class="line"><a name="l04326"></a><span class="lineno"> 4326</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> +<div class="line"><a name="l04327"></a><span class="lineno"> 4327</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>  <span class="comment">// Less efficient fallback: Use normal mutex.</span></div> +<div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>  <span class="keyword">class </span>VmaRWMutex</div> +<div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>  {</div> +<div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>  <span class="keywordtype">void</span> LockRead() { m_Mutex.Lock(); }</div> +<div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>  <span class="keywordtype">void</span> UnlockRead() { m_Mutex.Unlock(); }</div> +<div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>  <span class="keywordtype">bool</span> TryLockRead() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div> +<div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>  <span class="keywordtype">void</span> LockWrite() { m_Mutex.Lock(); }</div> +<div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>  <span class="keywordtype">void</span> UnlockWrite() { m_Mutex.Unlock(); }</div> +<div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>  <span class="keywordtype">bool</span> TryLockWrite() { <span class="keywordflow">return</span> m_Mutex.TryLock(); }</div> +<div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>  VMA_MUTEX m_Mutex;</div> +<div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>  };</div> +<div class="line"><a name="l04341"></a><span class="lineno"> 4341</span> <span class="preprocessor"> #define VMA_RW_MUTEX VmaRWMutex</span></div> +<div class="line"><a name="l04342"></a><span class="lineno"> 4342</span> <span class="preprocessor"> #endif </span><span class="comment">// #if VMA_USE_STL_SHARED_MUTEX</span></div> +<div class="line"><a name="l04343"></a><span class="lineno"> 4343</span> <span class="preprocessor">#endif </span><span class="comment">// #ifndef VMA_RW_MUTEX</span></div> <div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>  </div> -<div class="line"><a name="l04345"></a><span class="lineno"> 4345</span> <span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div> -<div class="line"><a name="l04346"></a><span class="lineno"> 4346</span> <span class="preprocessor"> #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div> -<div class="line"><a name="l04348"></a><span class="lineno"> 4348</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>  </div> -<div class="line"><a name="l04350"></a><span class="lineno"> 4350</span> <span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div> -<div class="line"><a name="l04351"></a><span class="lineno"> 4351</span> <span class="preprocessor"> #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div> -<div class="line"><a name="l04353"></a><span class="lineno"> 4353</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>  </div> -<div class="line"><a name="l04355"></a><span class="lineno"> 4355</span> <span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div> -<div class="line"><a name="l04356"></a><span class="lineno"> 4356</span> <span class="preprocessor"> #define VMA_CLASS_NO_COPY(className) \</span></div> -<div class="line"><a name="l04357"></a><span class="lineno"> 4357</span> <span class="preprocessor"> private: \</span></div> -<div class="line"><a name="l04358"></a><span class="lineno"> 4358</span> <span class="preprocessor"> className(const className&) = delete; \</span></div> -<div class="line"><a name="l04359"></a><span class="lineno"> 4359</span> <span class="preprocessor"> className& operator=(const className&) = delete;</span></div> -<div class="line"><a name="l04360"></a><span class="lineno"> 4360</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>  </div> -<div class="line"><a name="l04362"></a><span class="lineno"> 4362</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div> -<div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>  </div> -<div class="line"><a name="l04364"></a><span class="lineno"> 4364</span> <span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div> -<div class="line"><a name="l04365"></a><span class="lineno"> 4365</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div> -<div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>  </div> -<div class="line"><a name="l04367"></a><span class="lineno"> 4367</span> <span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED = 0xDC;</div> -<div class="line"><a name="l04368"></a><span class="lineno"> 4368</span> <span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div> -<div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>  </div> -<div class="line"><a name="l04370"></a><span class="lineno"> 4370</span> <span class="comment">/*******************************************************************************</span></div> -<div class="line"><a name="l04371"></a><span class="lineno"> 4371</span> <span class="comment">END OF CONFIGURATION</span></div> -<div class="line"><a name="l04372"></a><span class="lineno"> 4372</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>  </div> -<div class="line"><a name="l04374"></a><span class="lineno"> 4374</span> <span class="comment">// # Copy of some Vulkan definitions so we don't need to check their existence just to handle few constants.</span></div> -<div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>  </div> -<div class="line"><a name="l04376"></a><span class="lineno"> 4376</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY = 0x00000040;</div> -<div class="line"><a name="l04377"></a><span class="lineno"> 4377</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY = 0x00000080;</div> -<div class="line"><a name="l04378"></a><span class="lineno"> 4378</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY = 0x00020000;</div> -<div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>  </div> -<div class="line"><a name="l04380"></a><span class="lineno"> 4380</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</div> -<div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>  </div> -<div class="line"><a name="l04382"></a><span class="lineno"> 4382</span> <span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div> -<div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>  VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div> -<div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>  </div> -<div class="line"><a name="l04385"></a><span class="lineno"> 4385</span> <span class="comment">// Returns number of bits set to 1 in (v).</span></div> -<div class="line"><a name="l04386"></a><span class="lineno"> 4386</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div> -<div class="line"><a name="l04387"></a><span class="lineno"> 4387</span> {</div> -<div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>  uint32_t c = v - ((v >> 1) & 0x55555555);</div> -<div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>  c = ((c >> 2) & 0x33333333) + (c & 0x33333333);</div> -<div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>  c = ((c >> 4) + c) & 0x0F0F0F0F;</div> -<div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>  c = ((c >> 8) + c) & 0x00FF00FF;</div> -<div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>  c = ((c >> 16) + c) & 0x0000FFFF;</div> -<div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>  <span class="keywordflow">return</span> c;</div> -<div class="line"><a name="l04394"></a><span class="lineno"> 4394</span> }</div> -<div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>  </div> -<div class="line"><a name="l04396"></a><span class="lineno"> 4396</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04397"></a><span class="lineno"> 4397</span> <span class="comment">Returns true if given number is a power of two.</span></div> -<div class="line"><a name="l04398"></a><span class="lineno"> 4398</span> <span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div> -<div class="line"><a name="l04399"></a><span class="lineno"> 4399</span> <span class="comment">For 0 returns true.</span></div> -<div class="line"><a name="l04400"></a><span class="lineno"> 4400</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04401"></a><span class="lineno"> 4401</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04402"></a><span class="lineno"> 4402</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div> -<div class="line"><a name="l04403"></a><span class="lineno"> 4403</span> {</div> -<div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>  <span class="keywordflow">return</span> (x & (x-1)) == 0;</div> -<div class="line"><a name="l04405"></a><span class="lineno"> 4405</span> }</div> -<div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>  </div> -<div class="line"><a name="l04407"></a><span class="lineno"> 4407</span> <span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div> -<div class="line"><a name="l04408"></a><span class="lineno"> 4408</span> <span class="comment">// Use types like uint32_t, uint64_t as T.</span></div> -<div class="line"><a name="l04409"></a><span class="lineno"> 4409</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04410"></a><span class="lineno"> 4410</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T alignment)</div> -<div class="line"><a name="l04411"></a><span class="lineno"> 4411</span> {</div> -<div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>  VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div> -<div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>  <span class="keywordflow">return</span> (val + alignment - 1) & ~(alignment - 1);</div> -<div class="line"><a name="l04414"></a><span class="lineno"> 4414</span> }</div> -<div class="line"><a name="l04415"></a><span class="lineno"> 4415</span> <span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div> -<div class="line"><a name="l04416"></a><span class="lineno"> 4416</span> <span class="comment">// Use types like uint32_t, uint64_t as T.</span></div> -<div class="line"><a name="l04417"></a><span class="lineno"> 4417</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04418"></a><span class="lineno"> 4418</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T alignment)</div> -<div class="line"><a name="l04419"></a><span class="lineno"> 4419</span> {</div> -<div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>  VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div> -<div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>  <span class="keywordflow">return</span> val & ~(alignment - 1);</div> -<div class="line"><a name="l04422"></a><span class="lineno"> 4422</span> }</div> -<div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>  </div> -<div class="line"><a name="l04424"></a><span class="lineno"> 4424</span> <span class="comment">// Division with mathematical rounding to nearest number.</span></div> -<div class="line"><a name="l04425"></a><span class="lineno"> 4425</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04426"></a><span class="lineno"> 4426</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div> -<div class="line"><a name="l04427"></a><span class="lineno"> 4427</span> {</div> -<div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>  <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div> -<div class="line"><a name="l04429"></a><span class="lineno"> 4429</span> }</div> -<div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>  </div> -<div class="line"><a name="l04431"></a><span class="lineno"> 4431</span> <span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div> -<div class="line"><a name="l04432"></a><span class="lineno"> 4432</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</div> -<div class="line"><a name="l04433"></a><span class="lineno"> 4433</span> {</div> -<div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>  v--;</div> -<div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>  v |= v >> 1;</div> -<div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>  v |= v >> 2;</div> -<div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>  v |= v >> 4;</div> -<div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>  v |= v >> 8;</div> -<div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>  v |= v >> 16;</div> -<div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>  v++;</div> -<div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>  <span class="keywordflow">return</span> v;</div> -<div class="line"><a name="l04442"></a><span class="lineno"> 4442</span> }</div> -<div class="line"><a name="l04443"></a><span class="lineno"> 4443</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</div> -<div class="line"><a name="l04444"></a><span class="lineno"> 4444</span> {</div> -<div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>  v--;</div> -<div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>  v |= v >> 1;</div> -<div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>  v |= v >> 2;</div> -<div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>  v |= v >> 4;</div> -<div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>  v |= v >> 8;</div> -<div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>  v |= v >> 16;</div> -<div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>  v |= v >> 32;</div> -<div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>  v++;</div> -<div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>  <span class="keywordflow">return</span> v;</div> -<div class="line"><a name="l04454"></a><span class="lineno"> 4454</span> }</div> +<div class="line"><a name="l04345"></a><span class="lineno"> 4345</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04346"></a><span class="lineno"> 4346</span> <span class="comment">If providing your own implementation, you need to implement a subset of std::atomic.</span></div> +<div class="line"><a name="l04347"></a><span class="lineno"> 4347</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04348"></a><span class="lineno"> 4348</span> <span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div> +<div class="line"><a name="l04349"></a><span class="lineno"> 4349</span> <span class="preprocessor"> #include <atomic></span></div> +<div class="line"><a name="l04350"></a><span class="lineno"> 4350</span> <span class="preprocessor"> #define VMA_ATOMIC_UINT32 std::atomic<uint32_t></span></div> +<div class="line"><a name="l04351"></a><span class="lineno"> 4351</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>  </div> +<div class="line"><a name="l04353"></a><span class="lineno"> 4353</span> <span class="preprocessor">#ifndef VMA_ATOMIC_UINT64</span></div> +<div class="line"><a name="l04354"></a><span class="lineno"> 4354</span> <span class="preprocessor"> #include <atomic></span></div> +<div class="line"><a name="l04355"></a><span class="lineno"> 4355</span> <span class="preprocessor"> #define VMA_ATOMIC_UINT64 std::atomic<uint64_t></span></div> +<div class="line"><a name="l04356"></a><span class="lineno"> 4356</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>  </div> +<div class="line"><a name="l04358"></a><span class="lineno"> 4358</span> <span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div> +<div class="line"><a name="l04363"></a><span class="lineno"> 4363</span> <span class="preprocessor"> #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div> +<div class="line"><a name="l04364"></a><span class="lineno"> 4364</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>  </div> +<div class="line"><a name="l04366"></a><span class="lineno"> 4366</span> <span class="preprocessor">#ifndef VMA_MIN_ALIGNMENT</span></div> +<div class="line"><a name="l04371"></a><span class="lineno"> 4371</span> <span class="preprocessor"> #ifdef VMA_DEBUG_ALIGNMENT </span><span class="comment">// Old name</span></div> +<div class="line"><a name="l04372"></a><span class="lineno"> 4372</span> <span class="preprocessor"> #define VMA_MIN_ALIGNMENT VMA_DEBUG_ALIGNMENT</span></div> +<div class="line"><a name="l04373"></a><span class="lineno"> 4373</span> <span class="preprocessor"> #else</span></div> +<div class="line"><a name="l04374"></a><span class="lineno"> 4374</span> <span class="preprocessor"> #define VMA_MIN_ALIGNMENT (1)</span></div> +<div class="line"><a name="l04375"></a><span class="lineno"> 4375</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l04376"></a><span class="lineno"> 4376</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>  </div> +<div class="line"><a name="l04378"></a><span class="lineno"> 4378</span> <span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div> +<div class="line"><a name="l04383"></a><span class="lineno"> 4383</span> <span class="preprocessor"> #define VMA_DEBUG_MARGIN (0)</span></div> +<div class="line"><a name="l04384"></a><span class="lineno"> 4384</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>  </div> +<div class="line"><a name="l04386"></a><span class="lineno"> 4386</span> <span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div> +<div class="line"><a name="l04391"></a><span class="lineno"> 4391</span> <span class="preprocessor"> #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div> +<div class="line"><a name="l04392"></a><span class="lineno"> 4392</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>  </div> +<div class="line"><a name="l04394"></a><span class="lineno"> 4394</span> <span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div> +<div class="line"><a name="l04400"></a><span class="lineno"> 4400</span> <span class="preprocessor"> #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div> +<div class="line"><a name="l04401"></a><span class="lineno"> 4401</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>  </div> +<div class="line"><a name="l04403"></a><span class="lineno"> 4403</span> <span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div> +<div class="line"><a name="l04408"></a><span class="lineno"> 4408</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div> +<div class="line"><a name="l04409"></a><span class="lineno"> 4409</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>  </div> +<div class="line"><a name="l04411"></a><span class="lineno"> 4411</span> <span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div> +<div class="line"><a name="l04416"></a><span class="lineno"> 4416</span> <span class="preprocessor"> #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div> +<div class="line"><a name="l04417"></a><span class="lineno"> 4417</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>  </div> +<div class="line"><a name="l04419"></a><span class="lineno"> 4419</span> <span class="preprocessor">#ifndef VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT</span></div> +<div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l04421"></a><span class="lineno"> 4421</span> <span class="comment"> Set this to 1 to make VMA never exceed VkPhysicalDeviceLimits::maxMemoryAllocationCount</span></div> +<div class="line"><a name="l04422"></a><span class="lineno"> 4422</span> <span class="comment"> and return error instead of leaving up to Vulkan implementation what to do in such cases.</span></div> +<div class="line"><a name="l04423"></a><span class="lineno"> 4423</span> <span class="comment"> */</span></div> +<div class="line"><a name="l04424"></a><span class="lineno"> 4424</span> <span class="preprocessor"> #define VMA_DEBUG_DONT_EXCEED_MAX_MEMORY_ALLOCATION_COUNT (0)</span></div> +<div class="line"><a name="l04425"></a><span class="lineno"> 4425</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>  </div> +<div class="line"><a name="l04427"></a><span class="lineno"> 4427</span> <span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div> +<div class="line"><a name="l04429"></a><span class="lineno"> 4429</span> <span class="preprocessor"> #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div> +<div class="line"><a name="l04430"></a><span class="lineno"> 4430</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>  </div> +<div class="line"><a name="l04432"></a><span class="lineno"> 4432</span> <span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div> +<div class="line"><a name="l04434"></a><span class="lineno"> 4434</span> <span class="preprocessor"> #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div> +<div class="line"><a name="l04435"></a><span class="lineno"> 4435</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>  </div> +<div class="line"><a name="l04437"></a><span class="lineno"> 4437</span> <span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div> +<div class="line"><a name="l04438"></a><span class="lineno"> 4438</span> <span class="preprocessor"> #define VMA_CLASS_NO_COPY(className) \</span></div> +<div class="line"><a name="l04439"></a><span class="lineno"> 4439</span> <span class="preprocessor"> private: \</span></div> +<div class="line"><a name="l04440"></a><span class="lineno"> 4440</span> <span class="preprocessor"> className(const className&) = delete; \</span></div> +<div class="line"><a name="l04441"></a><span class="lineno"> 4441</span> <span class="preprocessor"> className& operator=(const className&) = delete;</span></div> +<div class="line"><a name="l04442"></a><span class="lineno"> 4442</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>  </div> +<div class="line"><a name="l04444"></a><span class="lineno"> 4444</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div> +<div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>  </div> +<div class="line"><a name="l04446"></a><span class="lineno"> 4446</span> <span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div> +<div class="line"><a name="l04447"></a><span class="lineno"> 4447</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div> +<div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>  </div> +<div class="line"><a name="l04449"></a><span class="lineno"> 4449</span> <span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED = 0xDC;</div> +<div class="line"><a name="l04450"></a><span class="lineno"> 4450</span> <span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div> +<div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>  </div> +<div class="line"><a name="l04452"></a><span class="lineno"> 4452</span> <span class="comment">/*******************************************************************************</span></div> +<div class="line"><a name="l04453"></a><span class="lineno"> 4453</span> <span class="comment">END OF CONFIGURATION</span></div> +<div class="line"><a name="l04454"></a><span class="lineno"> 4454</span> <span class="comment">*/</span></div> <div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>  </div> -<div class="line"><a name="l04456"></a><span class="lineno"> 4456</span> <span class="comment">// Returns largest power of 2 less or equal to v.</span></div> -<div class="line"><a name="l04457"></a><span class="lineno"> 4457</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</div> -<div class="line"><a name="l04458"></a><span class="lineno"> 4458</span> {</div> -<div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>  v |= v >> 1;</div> -<div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>  v |= v >> 2;</div> -<div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>  v |= v >> 4;</div> -<div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>  v |= v >> 8;</div> -<div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>  v |= v >> 16;</div> -<div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>  v = v ^ (v >> 1);</div> -<div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>  <span class="keywordflow">return</span> v;</div> -<div class="line"><a name="l04466"></a><span class="lineno"> 4466</span> }</div> -<div class="line"><a name="l04467"></a><span class="lineno"> 4467</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div> -<div class="line"><a name="l04468"></a><span class="lineno"> 4468</span> {</div> -<div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>  v |= v >> 1;</div> -<div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>  v |= v >> 2;</div> -<div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>  v |= v >> 4;</div> -<div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>  v |= v >> 8;</div> -<div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>  v |= v >> 16;</div> -<div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>  v |= v >> 32;</div> -<div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>  v = v ^ (v >> 1);</div> -<div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>  <span class="keywordflow">return</span> v;</div> -<div class="line"><a name="l04477"></a><span class="lineno"> 4477</span> }</div> -<div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>  </div> -<div class="line"><a name="l04479"></a><span class="lineno"> 4479</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l04480"></a><span class="lineno"> 4480</span> {</div> -<div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>  <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">'\0'</span>;</div> -<div class="line"><a name="l04482"></a><span class="lineno"> 4482</span> }</div> -<div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>  </div> -<div class="line"><a name="l04484"></a><span class="lineno"> 4484</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>  </div> -<div class="line"><a name="l04486"></a><span class="lineno"> 4486</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</div> -<div class="line"><a name="l04487"></a><span class="lineno"> 4487</span> {</div> -<div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>  <span class="keywordflow">switch</span>(algorithm)</div> -<div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>  {</div> -<div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div> -<div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Linear"</span>;</div> -<div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div> -<div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Buddy"</span>;</div> -<div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>  <span class="keywordflow">case</span> 0:</div> -<div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Default"</span>;</div> -<div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>  <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div> -<div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>  }</div> -<div class="line"><a name="l04500"></a><span class="lineno"> 4500</span> }</div> -<div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>  </div> -<div class="line"><a name="l04502"></a><span class="lineno"> 4502</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>  </div> -<div class="line"><a name="l04504"></a><span class="lineno"> 4504</span> <span class="preprocessor">#ifndef VMA_SORT</span></div> +<div class="line"><a name="l04456"></a><span class="lineno"> 4456</span> <span class="comment">// # Copy of some Vulkan definitions so we don't need to check their existence just to handle few constants.</span></div> +<div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>  </div> +<div class="line"><a name="l04458"></a><span class="lineno"> 4458</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD_COPY = 0x00000040;</div> +<div class="line"><a name="l04459"></a><span class="lineno"> 4459</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD_COPY = 0x00000080;</div> +<div class="line"><a name="l04460"></a><span class="lineno"> 4460</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_COPY = 0x00020000;</div> +<div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>  </div> +<div class="line"><a name="l04462"></a><span class="lineno"> 4462</span> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET = 0x10000000u;</div> +<div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>  </div> +<div class="line"><a name="l04464"></a><span class="lineno"> 4464</span> <span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div> +<div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>  VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div> +<div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>  </div> +<div class="line"><a name="l04467"></a><span class="lineno"> 4467</span> <span class="comment">// Returns number of bits set to 1 in (v).</span></div> +<div class="line"><a name="l04468"></a><span class="lineno"> 4468</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div> +<div class="line"><a name="l04469"></a><span class="lineno"> 4469</span> {</div> +<div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>  uint32_t c = v - ((v >> 1) & 0x55555555);</div> +<div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>  c = ((c >> 2) & 0x33333333) + (c & 0x33333333);</div> +<div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>  c = ((c >> 4) + c) & 0x0F0F0F0F;</div> +<div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>  c = ((c >> 8) + c) & 0x00FF00FF;</div> +<div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>  c = ((c >> 16) + c) & 0x0000FFFF;</div> +<div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>  <span class="keywordflow">return</span> c;</div> +<div class="line"><a name="l04476"></a><span class="lineno"> 4476</span> }</div> +<div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>  </div> +<div class="line"><a name="l04478"></a><span class="lineno"> 4478</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04479"></a><span class="lineno"> 4479</span> <span class="comment">Returns true if given number is a power of two.</span></div> +<div class="line"><a name="l04480"></a><span class="lineno"> 4480</span> <span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div> +<div class="line"><a name="l04481"></a><span class="lineno"> 4481</span> <span class="comment">For 0 returns true.</span></div> +<div class="line"><a name="l04482"></a><span class="lineno"> 4482</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04483"></a><span class="lineno"> 4483</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04484"></a><span class="lineno"> 4484</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div> +<div class="line"><a name="l04485"></a><span class="lineno"> 4485</span> {</div> +<div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>  <span class="keywordflow">return</span> (x & (x-1)) == 0;</div> +<div class="line"><a name="l04487"></a><span class="lineno"> 4487</span> }</div> +<div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>  </div> +<div class="line"><a name="l04489"></a><span class="lineno"> 4489</span> <span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div> +<div class="line"><a name="l04490"></a><span class="lineno"> 4490</span> <span class="comment">// Use types like uint32_t, uint64_t as T.</span></div> +<div class="line"><a name="l04491"></a><span class="lineno"> 4491</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04492"></a><span class="lineno"> 4492</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T alignment)</div> +<div class="line"><a name="l04493"></a><span class="lineno"> 4493</span> {</div> +<div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>  VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div> +<div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>  <span class="keywordflow">return</span> (val + alignment - 1) & ~(alignment - 1);</div> +<div class="line"><a name="l04496"></a><span class="lineno"> 4496</span> }</div> +<div class="line"><a name="l04497"></a><span class="lineno"> 4497</span> <span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div> +<div class="line"><a name="l04498"></a><span class="lineno"> 4498</span> <span class="comment">// Use types like uint32_t, uint64_t as T.</span></div> +<div class="line"><a name="l04499"></a><span class="lineno"> 4499</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04500"></a><span class="lineno"> 4500</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T alignment)</div> +<div class="line"><a name="l04501"></a><span class="lineno"> 4501</span> {</div> +<div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>  VMA_HEAVY_ASSERT(VmaIsPow2(alignment));</div> +<div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>  <span class="keywordflow">return</span> val & ~(alignment - 1);</div> +<div class="line"><a name="l04504"></a><span class="lineno"> 4504</span> }</div> <div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>  </div> -<div class="line"><a name="l04506"></a><span class="lineno"> 4506</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare></div> -<div class="line"><a name="l04507"></a><span class="lineno"> 4507</span> Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div> -<div class="line"><a name="l04508"></a><span class="lineno"> 4508</span> {</div> -<div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>  Iterator centerValue = end; --centerValue;</div> -<div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>  Iterator insertIndex = beg;</div> -<div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>  <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex < centerValue; ++memTypeIndex)</div> -<div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>  {</div> -<div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>  <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div> -<div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>  {</div> -<div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>  <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div> -<div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>  {</div> -<div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>  VMA_SWAP(*memTypeIndex, *insertIndex);</div> -<div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>  }</div> -<div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>  ++insertIndex;</div> -<div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>  }</div> -<div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>  }</div> -<div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>  <span class="keywordflow">if</span>(insertIndex != centerValue)</div> -<div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>  {</div> -<div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>  VMA_SWAP(*insertIndex, *centerValue);</div> -<div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>  }</div> -<div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>  <span class="keywordflow">return</span> insertIndex;</div> -<div class="line"><a name="l04527"></a><span class="lineno"> 4527</span> }</div> -<div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>  </div> -<div class="line"><a name="l04529"></a><span class="lineno"> 4529</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare></div> -<div class="line"><a name="l04530"></a><span class="lineno"> 4530</span> <span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div> -<div class="line"><a name="l04531"></a><span class="lineno"> 4531</span> {</div> -<div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>  <span class="keywordflow">if</span>(beg < end)</div> -<div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>  {</div> -<div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>  Iterator it = VmaQuickSortPartition<Iterator, Compare>(beg, end, cmp);</div> -<div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>  VmaQuickSort<Iterator, Compare>(beg, it, cmp);</div> -<div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>  VmaQuickSort<Iterator, Compare>(it + 1, end, cmp);</div> -<div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>  }</div> -<div class="line"><a name="l04538"></a><span class="lineno"> 4538</span> }</div> -<div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>  </div> -<div class="line"><a name="l04540"></a><span class="lineno"> 4540</span> <span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div> -<div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>  </div> -<div class="line"><a name="l04542"></a><span class="lineno"> 4542</span> <span class="preprocessor">#endif // #ifndef VMA_SORT</span></div> -<div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>  </div> -<div class="line"><a name="l04544"></a><span class="lineno"> 4544</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04545"></a><span class="lineno"> 4545</span> <span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div> -<div class="line"><a name="l04546"></a><span class="lineno"> 4546</span> <span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div> -<div class="line"><a name="l04547"></a><span class="lineno"> 4547</span> <span class="comment"></span> </div> -<div class="line"><a name="l04548"></a><span class="lineno"> 4548</span> <span class="comment">Algorithm is based on "Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)"</span></div> -<div class="line"><a name="l04549"></a><span class="lineno"> 4549</span> <span class="comment">chapter 11.6 "Resource Memory Association", paragraph "Buffer-Image Granularity".</span></div> -<div class="line"><a name="l04550"></a><span class="lineno"> 4550</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04551"></a><span class="lineno"> 4551</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div> -<div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>  VkDeviceSize resourceAOffset,</div> -<div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>  VkDeviceSize resourceASize,</div> -<div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>  VkDeviceSize resourceBOffset,</div> -<div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>  VkDeviceSize pageSize)</div> -<div class="line"><a name="l04556"></a><span class="lineno"> 4556</span> {</div> -<div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>  VMA_ASSERT(resourceAOffset + resourceASize <= resourceBOffset && resourceASize > 0 && pageSize > 0);</div> -<div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>  VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div> -<div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>  VkDeviceSize resourceAEndPage = resourceAEnd & ~(pageSize - 1);</div> -<div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>  VkDeviceSize resourceBStart = resourceBOffset;</div> -<div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>  VkDeviceSize resourceBStartPage = resourceBStart & ~(pageSize - 1);</div> -<div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>  <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div> -<div class="line"><a name="l04563"></a><span class="lineno"> 4563</span> }</div> -<div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>  </div> -<div class="line"><a name="l04565"></a><span class="lineno"> 4565</span> <span class="keyword">enum</span> VmaSuballocationType</div> -<div class="line"><a name="l04566"></a><span class="lineno"> 4566</span> {</div> -<div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>  VMA_SUBALLOCATION_TYPE_FREE = 0,</div> -<div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div> -<div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>  VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div> -<div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>  VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div> -<div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>  VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div> -<div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>  VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div> -<div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>  VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div> -<div class="line"><a name="l04574"></a><span class="lineno"> 4574</span> };</div> -<div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>  </div> -<div class="line"><a name="l04576"></a><span class="lineno"> 4576</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04577"></a><span class="lineno"> 4577</span> <span class="comment">Returns true if given suballocation types could conflict and must respect</span></div> -<div class="line"><a name="l04578"></a><span class="lineno"> 4578</span> <span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div> -<div class="line"><a name="l04579"></a><span class="lineno"> 4579</span> <span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div> -<div class="line"><a name="l04580"></a><span class="lineno"> 4580</span> <span class="comment">conservatively.</span></div> -<div class="line"><a name="l04581"></a><span class="lineno"> 4581</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04582"></a><span class="lineno"> 4582</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div> -<div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>  VmaSuballocationType suballocType1,</div> -<div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>  VmaSuballocationType suballocType2)</div> -<div class="line"><a name="l04585"></a><span class="lineno"> 4585</span> {</div> -<div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>  <span class="keywordflow">if</span>(suballocType1 > suballocType2)</div> -<div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>  {</div> -<div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>  VMA_SWAP(suballocType1, suballocType2);</div> -<div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>  }</div> -<div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>  </div> -<div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>  <span class="keywordflow">switch</span>(suballocType1)</div> -<div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>  {</div> -<div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div> -<div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div> -<div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div> -<div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>  <span class="keywordflow">return</span></div> -<div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> -<div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> -<div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div> -<div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>  <span class="keywordflow">return</span></div> -<div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> -<div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div> -<div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> -<div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div> -<div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>  <span class="keywordflow">return</span></div> -<div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> -<div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div> -<div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>  }</div> -<div class="line"><a name="l04615"></a><span class="lineno"> 4615</span> }</div> -<div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>  </div> -<div class="line"><a name="l04617"></a><span class="lineno"> 4617</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div> -<div class="line"><a name="l04618"></a><span class="lineno"> 4618</span> {</div> -<div class="line"><a name="l04619"></a><span class="lineno"> 4619</span> <span class="preprocessor">#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION</span></div> -<div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>  uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div> -<div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div> -<div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < numberCount; ++i, ++pDst)</div> -<div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>  {</div> -<div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>  *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div> -<div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>  }</div> -<div class="line"><a name="l04626"></a><span class="lineno"> 4626</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>  <span class="comment">// no-op</span></div> -<div class="line"><a name="l04628"></a><span class="lineno"> 4628</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04629"></a><span class="lineno"> 4629</span> }</div> -<div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>  </div> -<div class="line"><a name="l04631"></a><span class="lineno"> 4631</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div> -<div class="line"><a name="l04632"></a><span class="lineno"> 4632</span> {</div> -<div class="line"><a name="l04633"></a><span class="lineno"> 4633</span> <span class="preprocessor">#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION</span></div> -<div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>  <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div> -<div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div> -<div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < numberCount; ++i, ++pSrc)</div> -<div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>  {</div> -<div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>  <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div> -<div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>  {</div> -<div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>  }</div> -<div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>  }</div> -<div class="line"><a name="l04643"></a><span class="lineno"> 4643</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l04506"></a><span class="lineno"> 4506</span> <span class="comment">// Division with mathematical rounding to nearest number.</span></div> +<div class="line"><a name="l04507"></a><span class="lineno"> 4507</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04508"></a><span class="lineno"> 4508</span> <span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div> +<div class="line"><a name="l04509"></a><span class="lineno"> 4509</span> {</div> +<div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>  <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div> +<div class="line"><a name="l04511"></a><span class="lineno"> 4511</span> }</div> +<div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>  </div> +<div class="line"><a name="l04513"></a><span class="lineno"> 4513</span> <span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div> +<div class="line"><a name="l04514"></a><span class="lineno"> 4514</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</div> +<div class="line"><a name="l04515"></a><span class="lineno"> 4515</span> {</div> +<div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>  v--;</div> +<div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>  v |= v >> 1;</div> +<div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>  v |= v >> 2;</div> +<div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>  v |= v >> 4;</div> +<div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>  v |= v >> 8;</div> +<div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>  v |= v >> 16;</div> +<div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>  v++;</div> +<div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>  <span class="keywordflow">return</span> v;</div> +<div class="line"><a name="l04524"></a><span class="lineno"> 4524</span> }</div> +<div class="line"><a name="l04525"></a><span class="lineno"> 4525</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</div> +<div class="line"><a name="l04526"></a><span class="lineno"> 4526</span> {</div> +<div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>  v--;</div> +<div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>  v |= v >> 1;</div> +<div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>  v |= v >> 2;</div> +<div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>  v |= v >> 4;</div> +<div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>  v |= v >> 8;</div> +<div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>  v |= v >> 16;</div> +<div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>  v |= v >> 32;</div> +<div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>  v++;</div> +<div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>  <span class="keywordflow">return</span> v;</div> +<div class="line"><a name="l04536"></a><span class="lineno"> 4536</span> }</div> +<div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>  </div> +<div class="line"><a name="l04538"></a><span class="lineno"> 4538</span> <span class="comment">// Returns largest power of 2 less or equal to v.</span></div> +<div class="line"><a name="l04539"></a><span class="lineno"> 4539</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</div> +<div class="line"><a name="l04540"></a><span class="lineno"> 4540</span> {</div> +<div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>  v |= v >> 1;</div> +<div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>  v |= v >> 2;</div> +<div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>  v |= v >> 4;</div> +<div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>  v |= v >> 8;</div> +<div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>  v |= v >> 16;</div> +<div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>  v = v ^ (v >> 1);</div> +<div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>  <span class="keywordflow">return</span> v;</div> +<div class="line"><a name="l04548"></a><span class="lineno"> 4548</span> }</div> +<div class="line"><a name="l04549"></a><span class="lineno"> 4549</span> <span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div> +<div class="line"><a name="l04550"></a><span class="lineno"> 4550</span> {</div> +<div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>  v |= v >> 1;</div> +<div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>  v |= v >> 2;</div> +<div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>  v |= v >> 4;</div> +<div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>  v |= v >> 8;</div> +<div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>  v |= v >> 16;</div> +<div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>  v |= v >> 32;</div> +<div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>  v = v ^ (v >> 1);</div> +<div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>  <span class="keywordflow">return</span> v;</div> +<div class="line"><a name="l04559"></a><span class="lineno"> 4559</span> }</div> +<div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>  </div> +<div class="line"><a name="l04561"></a><span class="lineno"> 4561</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l04562"></a><span class="lineno"> 4562</span> {</div> +<div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>  <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">'\0'</span>;</div> +<div class="line"><a name="l04564"></a><span class="lineno"> 4564</span> }</div> +<div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>  </div> +<div class="line"><a name="l04566"></a><span class="lineno"> 4566</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>  </div> +<div class="line"><a name="l04568"></a><span class="lineno"> 4568</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</div> +<div class="line"><a name="l04569"></a><span class="lineno"> 4569</span> {</div> +<div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>  <span class="keywordflow">switch</span>(algorithm)</div> +<div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>  {</div> +<div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div> +<div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Linear"</span>;</div> +<div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div> +<div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Buddy"</span>;</div> +<div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>  <span class="keywordflow">case</span> 0:</div> +<div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>  <span class="keywordflow">return</span> <span class="stringliteral">"Default"</span>;</div> +<div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>  <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div> +<div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>  }</div> +<div class="line"><a name="l04582"></a><span class="lineno"> 4582</span> }</div> +<div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>  </div> +<div class="line"><a name="l04584"></a><span class="lineno"> 4584</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>  </div> +<div class="line"><a name="l04586"></a><span class="lineno"> 4586</span> <span class="preprocessor">#ifndef VMA_SORT</span></div> +<div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>  </div> +<div class="line"><a name="l04588"></a><span class="lineno"> 4588</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare></div> +<div class="line"><a name="l04589"></a><span class="lineno"> 4589</span> Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div> +<div class="line"><a name="l04590"></a><span class="lineno"> 4590</span> {</div> +<div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>  Iterator centerValue = end; --centerValue;</div> +<div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>  Iterator insertIndex = beg;</div> +<div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>  <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex < centerValue; ++memTypeIndex)</div> +<div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>  {</div> +<div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>  <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div> +<div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>  {</div> +<div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>  <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div> +<div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>  {</div> +<div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>  VMA_SWAP(*memTypeIndex, *insertIndex);</div> +<div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>  }</div> +<div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>  ++insertIndex;</div> +<div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>  }</div> +<div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>  }</div> +<div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>  <span class="keywordflow">if</span>(insertIndex != centerValue)</div> +<div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>  {</div> +<div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>  VMA_SWAP(*insertIndex, *centerValue);</div> +<div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>  }</div> +<div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>  <span class="keywordflow">return</span> insertIndex;</div> +<div class="line"><a name="l04609"></a><span class="lineno"> 4609</span> }</div> +<div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>  </div> +<div class="line"><a name="l04611"></a><span class="lineno"> 4611</span> <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare></div> +<div class="line"><a name="l04612"></a><span class="lineno"> 4612</span> <span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div> +<div class="line"><a name="l04613"></a><span class="lineno"> 4613</span> {</div> +<div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>  <span class="keywordflow">if</span>(beg < end)</div> +<div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>  {</div> +<div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>  Iterator it = VmaQuickSortPartition<Iterator, Compare>(beg, end, cmp);</div> +<div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>  VmaQuickSort<Iterator, Compare>(beg, it, cmp);</div> +<div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>  VmaQuickSort<Iterator, Compare>(it + 1, end, cmp);</div> +<div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>  }</div> +<div class="line"><a name="l04620"></a><span class="lineno"> 4620</span> }</div> +<div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>  </div> +<div class="line"><a name="l04622"></a><span class="lineno"> 4622</span> <span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div> +<div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>  </div> +<div class="line"><a name="l04624"></a><span class="lineno"> 4624</span> <span class="preprocessor">#endif </span><span class="comment">// #ifndef VMA_SORT</span></div> +<div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>  </div> +<div class="line"><a name="l04626"></a><span class="lineno"> 4626</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04627"></a><span class="lineno"> 4627</span> <span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div> +<div class="line"><a name="l04628"></a><span class="lineno"> 4628</span> <span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div> +<div class="line"><a name="l04629"></a><span class="lineno"> 4629</span> <span class="comment"></span> </div> +<div class="line"><a name="l04630"></a><span class="lineno"> 4630</span> <span class="comment">Algorithm is based on "Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)"</span></div> +<div class="line"><a name="l04631"></a><span class="lineno"> 4631</span> <span class="comment">chapter 11.6 "Resource Memory Association", paragraph "Buffer-Image Granularity".</span></div> +<div class="line"><a name="l04632"></a><span class="lineno"> 4632</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04633"></a><span class="lineno"> 4633</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div> +<div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>  VkDeviceSize resourceAOffset,</div> +<div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>  VkDeviceSize resourceASize,</div> +<div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>  VkDeviceSize resourceBOffset,</div> +<div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>  VkDeviceSize pageSize)</div> +<div class="line"><a name="l04638"></a><span class="lineno"> 4638</span> {</div> +<div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>  VMA_ASSERT(resourceAOffset + resourceASize <= resourceBOffset && resourceASize > 0 && pageSize > 0);</div> +<div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>  VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div> +<div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>  VkDeviceSize resourceAEndPage = resourceAEnd & ~(pageSize - 1);</div> +<div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>  VkDeviceSize resourceBStart = resourceBOffset;</div> +<div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>  VkDeviceSize resourceBStartPage = resourceBStart & ~(pageSize - 1);</div> +<div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>  <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div> <div class="line"><a name="l04645"></a><span class="lineno"> 4645</span> }</div> <div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>  </div> -<div class="line"><a name="l04647"></a><span class="lineno"> 4647</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04648"></a><span class="lineno"> 4648</span> <span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div> -<div class="line"><a name="l04649"></a><span class="lineno"> 4649</span> <span class="comment">during GPU memory defragmentation.</span></div> -<div class="line"><a name="l04650"></a><span class="lineno"> 4650</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04651"></a><span class="lineno"> 4651</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo& outBufCreateInfo)</div> -<div class="line"><a name="l04652"></a><span class="lineno"> 4652</span> {</div> -<div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>  memset(&outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div> -<div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>  outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div> -<div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>  outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div> -<div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>  outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></div> -<div class="line"><a name="l04657"></a><span class="lineno"> 4657</span> }</div> -<div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>  </div> -<div class="line"><a name="l04659"></a><span class="lineno"> 4659</span> <span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div> -<div class="line"><a name="l04660"></a><span class="lineno"> 4660</span> <span class="keyword">struct </span>VmaMutexLock</div> -<div class="line"><a name="l04661"></a><span class="lineno"> 4661</span> {</div> -<div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>  VMA_CLASS_NO_COPY(VmaMutexLock)</div> -<div class="line"><a name="l04663"></a><span class="lineno"> 4663</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>  VmaMutexLock(VMA_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div> -<div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> -<div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->Lock(); } }</div> -<div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>  ~VmaMutexLock()</div> -<div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->Unlock(); } }</div> -<div class="line"><a name="l04669"></a><span class="lineno"> 4669</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>  VMA_MUTEX* m_pMutex;</div> -<div class="line"><a name="l04671"></a><span class="lineno"> 4671</span> };</div> +<div class="line"><a name="l04647"></a><span class="lineno"> 4647</span> <span class="keyword">enum</span> VmaSuballocationType</div> +<div class="line"><a name="l04648"></a><span class="lineno"> 4648</span> {</div> +<div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>  VMA_SUBALLOCATION_TYPE_FREE = 0,</div> +<div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>  VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div> +<div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>  VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div> +<div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>  VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div> +<div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>  VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div> +<div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>  VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div> +<div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>  VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div> +<div class="line"><a name="l04656"></a><span class="lineno"> 4656</span> };</div> +<div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>  </div> +<div class="line"><a name="l04658"></a><span class="lineno"> 4658</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04659"></a><span class="lineno"> 4659</span> <span class="comment">Returns true if given suballocation types could conflict and must respect</span></div> +<div class="line"><a name="l04660"></a><span class="lineno"> 4660</span> <span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div> +<div class="line"><a name="l04661"></a><span class="lineno"> 4661</span> <span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div> +<div class="line"><a name="l04662"></a><span class="lineno"> 4662</span> <span class="comment">conservatively.</span></div> +<div class="line"><a name="l04663"></a><span class="lineno"> 4663</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04664"></a><span class="lineno"> 4664</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div> +<div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>  VmaSuballocationType suballocType1,</div> +<div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>  VmaSuballocationType suballocType2)</div> +<div class="line"><a name="l04667"></a><span class="lineno"> 4667</span> {</div> +<div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>  <span class="keywordflow">if</span>(suballocType1 > suballocType2)</div> +<div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>  {</div> +<div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>  VMA_SWAP(suballocType1, suballocType2);</div> +<div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>  }</div> <div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>  </div> -<div class="line"><a name="l04673"></a><span class="lineno"> 4673</span> <span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div> -<div class="line"><a name="l04674"></a><span class="lineno"> 4674</span> <span class="keyword">struct </span>VmaMutexLockRead</div> -<div class="line"><a name="l04675"></a><span class="lineno"> 4675</span> {</div> -<div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>  VMA_CLASS_NO_COPY(VmaMutexLockRead)</div> -<div class="line"><a name="l04677"></a><span class="lineno"> 4677</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>  VmaMutexLockRead(VMA_RW_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex) :</div> -<div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> -<div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->LockRead(); } }</div> -<div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>  ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->UnlockRead(); } }</div> -<div class="line"><a name="l04682"></a><span class="lineno"> 4682</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>  VMA_RW_MUTEX* m_pMutex;</div> -<div class="line"><a name="l04684"></a><span class="lineno"> 4684</span> };</div> -<div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>  </div> -<div class="line"><a name="l04686"></a><span class="lineno"> 4686</span> <span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div> -<div class="line"><a name="l04687"></a><span class="lineno"> 4687</span> <span class="keyword">struct </span>VmaMutexLockWrite</div> -<div class="line"><a name="l04688"></a><span class="lineno"> 4688</span> {</div> -<div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>  VMA_CLASS_NO_COPY(VmaMutexLockWrite)</div> -<div class="line"><a name="l04690"></a><span class="lineno"> 4690</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>  VmaMutexLockWrite(VMA_RW_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex) :</div> -<div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> -<div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->LockWrite(); } }</div> -<div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>  ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->UnlockWrite(); } }</div> -<div class="line"><a name="l04695"></a><span class="lineno"> 4695</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>  VMA_RW_MUTEX* m_pMutex;</div> -<div class="line"><a name="l04697"></a><span class="lineno"> 4697</span> };</div> +<div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>  <span class="keywordflow">switch</span>(suballocType1)</div> +<div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>  {</div> +<div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div> +<div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div> +<div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div> +<div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>  <span class="keywordflow">return</span></div> +<div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> +<div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> +<div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div> +<div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>  <span class="keywordflow">return</span></div> +<div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> +<div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div> +<div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> +<div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div> +<div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>  <span class="keywordflow">return</span></div> +<div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>  suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div> +<div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>  <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div> +<div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>  }</div> +<div class="line"><a name="l04697"></a><span class="lineno"> 4697</span> }</div> <div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>  </div> -<div class="line"><a name="l04699"></a><span class="lineno"> 4699</span> <span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div> -<div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>  <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div> -<div class="line"><a name="l04701"></a><span class="lineno"> 4701</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div> -<div class="line"><a name="l04702"></a><span class="lineno"> 4702</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l04703"></a><span class="lineno"> 4703</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div> -<div class="line"><a name="l04704"></a><span class="lineno"> 4704</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>  </div> -<div class="line"><a name="l04706"></a><span class="lineno"> 4706</span> <span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div> -<div class="line"><a name="l04707"></a><span class="lineno"> 4707</span> <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div> -<div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>  </div> -<div class="line"><a name="l04709"></a><span class="lineno"> 4709</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04710"></a><span class="lineno"> 4710</span> <span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div> -<div class="line"><a name="l04711"></a><span class="lineno"> 4711</span> <span class="comment">equal to (key), according to comparison (cmp).</span></div> -<div class="line"><a name="l04712"></a><span class="lineno"> 4712</span> <span class="comment"></span> </div> -<div class="line"><a name="l04713"></a><span class="lineno"> 4713</span> <span class="comment">Cmp should return true if first argument is less than second argument.</span></div> -<div class="line"><a name="l04714"></a><span class="lineno"> 4714</span> <span class="comment"></span> </div> -<div class="line"><a name="l04715"></a><span class="lineno"> 4715</span> <span class="comment">Returned value is the found element, if present in the collection or place where</span></div> -<div class="line"><a name="l04716"></a><span class="lineno"> 4716</span> <span class="comment">new element with value (key) should be inserted.</span></div> -<div class="line"><a name="l04717"></a><span class="lineno"> 4717</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04718"></a><span class="lineno"> 4718</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT></div> -<div class="line"><a name="l04719"></a><span class="lineno"> 4719</span> <span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &key, <span class="keyword">const</span> CmpLess& cmp)</div> -<div class="line"><a name="l04720"></a><span class="lineno"> 4720</span> {</div> -<div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>  <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div> -<div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>  <span class="keywordflow">while</span>(down < up)</div> -<div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>  {</div> -<div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div> -<div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>  <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div> -<div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>  {</div> -<div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>  down = mid + 1;</div> -<div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>  }</div> -<div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>  {</div> -<div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>  up = mid;</div> -<div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>  }</div> -<div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>  }</div> -<div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>  <span class="keywordflow">return</span> beg + down;</div> -<div class="line"><a name="l04735"></a><span class="lineno"> 4735</span> }</div> -<div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>  </div> -<div class="line"><a name="l04737"></a><span class="lineno"> 4737</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT></div> -<div class="line"><a name="l04738"></a><span class="lineno"> 4738</span> IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT& beg, <span class="keyword">const</span> IterT& end, <span class="keyword">const</span> KeyT& value, <span class="keyword">const</span> CmpLess& cmp)</div> -<div class="line"><a name="l04739"></a><span class="lineno"> 4739</span> {</div> -<div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>  IterT it = VmaBinaryFindFirstNotLess<CmpLess, IterT, KeyT>(</div> -<div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>  beg, end, value, cmp);</div> -<div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>  <span class="keywordflow">if</span>(it == end ||</div> -<div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>  (!cmp(*it, value) && !cmp(value, *it)))</div> -<div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>  {</div> -<div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>  <span class="keywordflow">return</span> it;</div> -<div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>  }</div> -<div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>  <span class="keywordflow">return</span> end;</div> -<div class="line"><a name="l04748"></a><span class="lineno"> 4748</span> }</div> -<div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>  </div> -<div class="line"><a name="l04750"></a><span class="lineno"> 4750</span> <span class="comment">/*</span></div> -<div class="line"><a name="l04751"></a><span class="lineno"> 4751</span> <span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div> -<div class="line"><a name="l04752"></a><span class="lineno"> 4752</span> <span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div> -<div class="line"><a name="l04753"></a><span class="lineno"> 4753</span> <span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div> -<div class="line"><a name="l04754"></a><span class="lineno"> 4754</span> <span class="comment">*/</span></div> -<div class="line"><a name="l04755"></a><span class="lineno"> 4755</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04756"></a><span class="lineno"> 4756</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</div> +<div class="line"><a name="l04699"></a><span class="lineno"> 4699</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div> +<div class="line"><a name="l04700"></a><span class="lineno"> 4700</span> {</div> +<div class="line"><a name="l04701"></a><span class="lineno"> 4701</span> <span class="preprocessor">#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION</span></div> +<div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>  uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div> +<div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div> +<div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < numberCount; ++i, ++pDst)</div> +<div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>  {</div> +<div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>  *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div> +<div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>  }</div> +<div class="line"><a name="l04708"></a><span class="lineno"> 4708</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>  <span class="comment">// no-op</span></div> +<div class="line"><a name="l04710"></a><span class="lineno"> 4710</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04711"></a><span class="lineno"> 4711</span> }</div> +<div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>  </div> +<div class="line"><a name="l04713"></a><span class="lineno"> 4713</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div> +<div class="line"><a name="l04714"></a><span class="lineno"> 4714</span> {</div> +<div class="line"><a name="l04715"></a><span class="lineno"> 4715</span> <span class="preprocessor">#if VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_DETECT_CORRUPTION</span></div> +<div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>  <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div> +<div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div> +<div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < numberCount; ++i, ++pSrc)</div> +<div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>  {</div> +<div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>  <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div> +<div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>  {</div> +<div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>  }</div> +<div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>  }</div> +<div class="line"><a name="l04725"></a><span class="lineno"> 4725</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l04727"></a><span class="lineno"> 4727</span> }</div> +<div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>  </div> +<div class="line"><a name="l04729"></a><span class="lineno"> 4729</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04730"></a><span class="lineno"> 4730</span> <span class="comment">Fills structure with parameters of an example buffer to be used for transfers</span></div> +<div class="line"><a name="l04731"></a><span class="lineno"> 4731</span> <span class="comment">during GPU memory defragmentation.</span></div> +<div class="line"><a name="l04732"></a><span class="lineno"> 4732</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04733"></a><span class="lineno"> 4733</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFillGpuDefragmentationBufferCreateInfo(VkBufferCreateInfo& outBufCreateInfo)</div> +<div class="line"><a name="l04734"></a><span class="lineno"> 4734</span> {</div> +<div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>  memset(&outBufCreateInfo, 0, <span class="keyword">sizeof</span>(outBufCreateInfo));</div> +<div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>  outBufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;</div> +<div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>  outBufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div> +<div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>  outBufCreateInfo.size = (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE; <span class="comment">// Example size.</span></div> +<div class="line"><a name="l04739"></a><span class="lineno"> 4739</span> }</div> +<div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>  </div> +<div class="line"><a name="l04741"></a><span class="lineno"> 4741</span> <span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div> +<div class="line"><a name="l04742"></a><span class="lineno"> 4742</span> <span class="keyword">struct </span>VmaMutexLock</div> +<div class="line"><a name="l04743"></a><span class="lineno"> 4743</span> {</div> +<div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>  VMA_CLASS_NO_COPY(VmaMutexLock)</div> +<div class="line"><a name="l04745"></a><span class="lineno"> 4745</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>  VmaMutexLock(VMA_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex = <span class="keyword">true</span>) :</div> +<div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> +<div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->Lock(); } }</div> +<div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>  ~VmaMutexLock()</div> +<div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->Unlock(); } }</div> +<div class="line"><a name="l04751"></a><span class="lineno"> 4751</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>  VMA_MUTEX* m_pMutex;</div> +<div class="line"><a name="l04753"></a><span class="lineno"> 4753</span> };</div> +<div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>  </div> +<div class="line"><a name="l04755"></a><span class="lineno"> 4755</span> <span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.</span></div> +<div class="line"><a name="l04756"></a><span class="lineno"> 4756</span> <span class="keyword">struct </span>VmaMutexLockRead</div> <div class="line"><a name="l04757"></a><span class="lineno"> 4757</span> {</div> -<div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < count; ++i)</div> -<div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>  {</div> -<div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>  <span class="keyword">const</span> T iPtr = arr[i];</div> -<div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>  <span class="keywordflow">if</span>(iPtr == VMA_NULL)</div> -<div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>  {</div> -<div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>  }</div> -<div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>  <span class="keywordflow">for</span>(uint32_t j = i + 1; j < count; ++j)</div> -<div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>  {</div> -<div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>  <span class="keywordflow">if</span>(iPtr == arr[j])</div> -<div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>  {</div> -<div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>  }</div> -<div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>  }</div> -<div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>  }</div> -<div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l04774"></a><span class="lineno"> 4774</span> }</div> -<div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>  </div> -<div class="line"><a name="l04776"></a><span class="lineno"> 4776</span> <span class="keyword">template</span><<span class="keyword">typename</span> MainT, <span class="keyword">typename</span> NewT></div> -<div class="line"><a name="l04777"></a><span class="lineno"> 4777</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPnextChainPushFront(MainT* mainStruct, NewT* newStruct)</div> -<div class="line"><a name="l04778"></a><span class="lineno"> 4778</span> {</div> -<div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>  newStruct->pNext = mainStruct->pNext;</div> -<div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>  mainStruct->pNext = newStruct;</div> -<div class="line"><a name="l04781"></a><span class="lineno"> 4781</span> }</div> -<div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>  </div> -<div class="line"><a name="l04784"></a><span class="lineno"> 4784</span> <span class="comment">// Memory allocation</span></div> -<div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>  </div> -<div class="line"><a name="l04786"></a><span class="lineno"> 4786</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div> -<div class="line"><a name="l04787"></a><span class="lineno"> 4787</span> {</div> -<div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>  <span class="keywordtype">void</span>* result = VMA_NULL;</div> -<div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>  <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &&</div> -<div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>  (pAllocationCallbacks->pfnAllocation != VMA_NULL))</div> -<div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>  {</div> -<div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>  result = (*pAllocationCallbacks->pfnAllocation)(</div> -<div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>  pAllocationCallbacks->pUserData,</div> -<div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>  size,</div> -<div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>  alignment,</div> -<div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>  VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div> -<div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>  }</div> -<div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>  {</div> -<div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>  result = VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div> -<div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>  }</div> -<div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>  VMA_ASSERT(result != VMA_NULL && <span class="stringliteral">"CPU memory allocation failed."</span>);</div> -<div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l04804"></a><span class="lineno"> 4804</span> }</div> -<div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>  </div> -<div class="line"><a name="l04806"></a><span class="lineno"> 4806</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l04807"></a><span class="lineno"> 4807</span> {</div> -<div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>  <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &&</div> -<div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>  (pAllocationCallbacks->pfnFree != VMA_NULL))</div> -<div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>  {</div> -<div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>  (*pAllocationCallbacks->pfnFree)(pAllocationCallbacks->pUserData, ptr);</div> -<div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>  }</div> -<div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>  {</div> -<div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>  VMA_SYSTEM_ALIGNED_FREE(ptr);</div> -<div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>  }</div> +<div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>  VMA_CLASS_NO_COPY(VmaMutexLockRead)</div> +<div class="line"><a name="l04759"></a><span class="lineno"> 4759</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>  VmaMutexLockRead(VMA_RW_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex) :</div> +<div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> +<div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->LockRead(); } }</div> +<div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>  ~VmaMutexLockRead() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->UnlockRead(); } }</div> +<div class="line"><a name="l04764"></a><span class="lineno"> 4764</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>  VMA_RW_MUTEX* m_pMutex;</div> +<div class="line"><a name="l04766"></a><span class="lineno"> 4766</span> };</div> +<div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>  </div> +<div class="line"><a name="l04768"></a><span class="lineno"> 4768</span> <span class="comment">// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.</span></div> +<div class="line"><a name="l04769"></a><span class="lineno"> 4769</span> <span class="keyword">struct </span>VmaMutexLockWrite</div> +<div class="line"><a name="l04770"></a><span class="lineno"> 4770</span> {</div> +<div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>  VMA_CLASS_NO_COPY(VmaMutexLockWrite)</div> +<div class="line"><a name="l04772"></a><span class="lineno"> 4772</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>  VmaMutexLockWrite(VMA_RW_MUTEX& mutex, <span class="keywordtype">bool</span> useMutex) :</div> +<div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>  m_pMutex(useMutex ? &mutex : VMA_NULL)</div> +<div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>  { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->LockWrite(); } }</div> +<div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>  ~VmaMutexLockWrite() { <span class="keywordflow">if</span>(m_pMutex) { m_pMutex->UnlockWrite(); } }</div> +<div class="line"><a name="l04777"></a><span class="lineno"> 4777</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>  VMA_RW_MUTEX* m_pMutex;</div> +<div class="line"><a name="l04779"></a><span class="lineno"> 4779</span> };</div> +<div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>  </div> +<div class="line"><a name="l04781"></a><span class="lineno"> 4781</span> <span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div> +<div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>  <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div> +<div class="line"><a name="l04783"></a><span class="lineno"> 4783</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div> +<div class="line"><a name="l04784"></a><span class="lineno"> 4784</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l04785"></a><span class="lineno"> 4785</span> <span class="preprocessor"> #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div> +<div class="line"><a name="l04786"></a><span class="lineno"> 4786</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>  </div> +<div class="line"><a name="l04788"></a><span class="lineno"> 4788</span> <span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div> +<div class="line"><a name="l04789"></a><span class="lineno"> 4789</span> <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div> +<div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>  </div> +<div class="line"><a name="l04791"></a><span class="lineno"> 4791</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04792"></a><span class="lineno"> 4792</span> <span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div> +<div class="line"><a name="l04793"></a><span class="lineno"> 4793</span> <span class="comment">equal to (key), according to comparison (cmp).</span></div> +<div class="line"><a name="l04794"></a><span class="lineno"> 4794</span> <span class="comment"></span> </div> +<div class="line"><a name="l04795"></a><span class="lineno"> 4795</span> <span class="comment">Cmp should return true if first argument is less than second argument.</span></div> +<div class="line"><a name="l04796"></a><span class="lineno"> 4796</span> <span class="comment"></span> </div> +<div class="line"><a name="l04797"></a><span class="lineno"> 4797</span> <span class="comment">Returned value is the found element, if present in the collection or place where</span></div> +<div class="line"><a name="l04798"></a><span class="lineno"> 4798</span> <span class="comment">new element with value (key) should be inserted.</span></div> +<div class="line"><a name="l04799"></a><span class="lineno"> 4799</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04800"></a><span class="lineno"> 4800</span> <span class="keyword">template</span> <<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT></div> +<div class="line"><a name="l04801"></a><span class="lineno"> 4801</span> <span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &key, <span class="keyword">const</span> CmpLess& cmp)</div> +<div class="line"><a name="l04802"></a><span class="lineno"> 4802</span> {</div> +<div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>  <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div> +<div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>  <span class="keywordflow">while</span>(down < up)</div> +<div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>  {</div> +<div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = down + (up - down) / 2; <span class="comment">// Overflow-safe midpoint calculation</span></div> +<div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>  <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div> +<div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>  {</div> +<div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>  down = mid + 1;</div> +<div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>  }</div> +<div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>  {</div> +<div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>  up = mid;</div> +<div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>  }</div> +<div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>  }</div> +<div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>  <span class="keywordflow">return</span> beg + down;</div> <div class="line"><a name="l04817"></a><span class="lineno"> 4817</span> }</div> <div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>  </div> -<div class="line"><a name="l04819"></a><span class="lineno"> 4819</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04820"></a><span class="lineno"> 4820</span> <span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div> +<div class="line"><a name="l04819"></a><span class="lineno"> 4819</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT></div> +<div class="line"><a name="l04820"></a><span class="lineno"> 4820</span> IterT VmaBinaryFindSorted(<span class="keyword">const</span> IterT& beg, <span class="keyword">const</span> IterT& end, <span class="keyword">const</span> KeyT& value, <span class="keyword">const</span> CmpLess& cmp)</div> <div class="line"><a name="l04821"></a><span class="lineno"> 4821</span> {</div> -<div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div> -<div class="line"><a name="l04823"></a><span class="lineno"> 4823</span> }</div> -<div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>  </div> -<div class="line"><a name="l04825"></a><span class="lineno"> 4825</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04826"></a><span class="lineno"> 4826</span> <span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div> -<div class="line"><a name="l04827"></a><span class="lineno"> 4827</span> {</div> -<div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div> -<div class="line"><a name="l04829"></a><span class="lineno"> 4829</span> }</div> -<div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>  </div> -<div class="line"><a name="l04831"></a><span class="lineno"> 4831</span> <span class="preprocessor">#define vma_new(allocator, type) new(VmaAllocate<type>(allocator))(type)</span></div> -<div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>  </div> -<div class="line"><a name="l04833"></a><span class="lineno"> 4833</span> <span class="preprocessor">#define vma_new_array(allocator, type, count) new(VmaAllocateArray<type>((allocator), (count)))(type)</span></div> -<div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>  </div> -<div class="line"><a name="l04835"></a><span class="lineno"> 4835</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04836"></a><span class="lineno"> 4836</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div> -<div class="line"><a name="l04837"></a><span class="lineno"> 4837</span> {</div> -<div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>  ptr->~T();</div> -<div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>  VmaFree(pAllocationCallbacks, ptr);</div> -<div class="line"><a name="l04840"></a><span class="lineno"> 4840</span> }</div> -<div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>  </div> -<div class="line"><a name="l04842"></a><span class="lineno"> 4842</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04843"></a><span class="lineno"> 4843</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div> -<div class="line"><a name="l04844"></a><span class="lineno"> 4844</span> {</div> -<div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> -<div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>  {</div> -<div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div> +<div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>  IterT it = VmaBinaryFindFirstNotLess<CmpLess, IterT, KeyT>(</div> +<div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>  beg, end, value, cmp);</div> +<div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>  <span class="keywordflow">if</span>(it == end ||</div> +<div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>  (!cmp(*it, value) && !cmp(value, *it)))</div> +<div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>  {</div> +<div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>  <span class="keywordflow">return</span> it;</div> +<div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>  }</div> +<div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>  <span class="keywordflow">return</span> end;</div> +<div class="line"><a name="l04830"></a><span class="lineno"> 4830</span> }</div> +<div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>  </div> +<div class="line"><a name="l04832"></a><span class="lineno"> 4832</span> <span class="comment">/*</span></div> +<div class="line"><a name="l04833"></a><span class="lineno"> 4833</span> <span class="comment">Returns true if all pointers in the array are not-null and unique.</span></div> +<div class="line"><a name="l04834"></a><span class="lineno"> 4834</span> <span class="comment">Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.</span></div> +<div class="line"><a name="l04835"></a><span class="lineno"> 4835</span> <span class="comment">T must be pointer type, e.g. VmaAllocation, VmaPool.</span></div> +<div class="line"><a name="l04836"></a><span class="lineno"> 4836</span> <span class="comment">*/</span></div> +<div class="line"><a name="l04837"></a><span class="lineno"> 4837</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04838"></a><span class="lineno"> 4838</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidatePointerArray(uint32_t count, <span class="keyword">const</span> T* arr)</div> +<div class="line"><a name="l04839"></a><span class="lineno"> 4839</span> {</div> +<div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < count; ++i)</div> +<div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>  {</div> +<div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>  <span class="keyword">const</span> T iPtr = arr[i];</div> +<div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>  <span class="keywordflow">if</span>(iPtr == VMA_NULL)</div> +<div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>  {</div> +<div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>  }</div> +<div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>  <span class="keywordflow">for</span>(uint32_t j = i + 1; j < count; ++j)</div> <div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>  {</div> -<div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>  ptr[i].~T();</div> -<div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>  }</div> -<div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>  VmaFree(pAllocationCallbacks, ptr);</div> -<div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>  }</div> -<div class="line"><a name="l04853"></a><span class="lineno"> 4853</span> }</div> -<div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>  </div> -<div class="line"><a name="l04855"></a><span class="lineno"> 4855</span> <span class="keyword">static</span> <span class="keywordtype">char</span>* VmaCreateStringCopy(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keyword">const</span> <span class="keywordtype">char</span>* srcStr)</div> -<div class="line"><a name="l04856"></a><span class="lineno"> 4856</span> {</div> -<div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>  <span class="keywordflow">if</span>(srcStr != VMA_NULL)</div> -<div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>  {</div> -<div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(srcStr);</div> -<div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>  <span class="keywordtype">char</span>* <span class="keyword">const</span> result = vma_new_array(allocs, <span class="keywordtype">char</span>, len + 1);</div> -<div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>  memcpy(result, srcStr, len + 1);</div> -<div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>  }</div> -<div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>  {</div> -<div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>  <span class="keywordflow">return</span> VMA_NULL;</div> -<div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>  }</div> -<div class="line"><a name="l04868"></a><span class="lineno"> 4868</span> }</div> -<div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>  </div> -<div class="line"><a name="l04870"></a><span class="lineno"> 4870</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFreeString(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keywordtype">char</span>* str)</div> -<div class="line"><a name="l04871"></a><span class="lineno"> 4871</span> {</div> -<div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>  <span class="keywordflow">if</span>(str != VMA_NULL)</div> +<div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>  <span class="keywordflow">if</span>(iPtr == arr[j])</div> +<div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>  {</div> +<div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>  }</div> +<div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>  }</div> +<div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>  }</div> +<div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l04856"></a><span class="lineno"> 4856</span> }</div> +<div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>  </div> +<div class="line"><a name="l04858"></a><span class="lineno"> 4858</span> <span class="keyword">template</span><<span class="keyword">typename</span> MainT, <span class="keyword">typename</span> NewT></div> +<div class="line"><a name="l04859"></a><span class="lineno"> 4859</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPnextChainPushFront(MainT* mainStruct, NewT* newStruct)</div> +<div class="line"><a name="l04860"></a><span class="lineno"> 4860</span> {</div> +<div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>  newStruct->pNext = mainStruct->pNext;</div> +<div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>  mainStruct->pNext = newStruct;</div> +<div class="line"><a name="l04863"></a><span class="lineno"> 4863</span> }</div> +<div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>  </div> +<div class="line"><a name="l04866"></a><span class="lineno"> 4866</span> <span class="comment">// Memory allocation</span></div> +<div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>  </div> +<div class="line"><a name="l04868"></a><span class="lineno"> 4868</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div> +<div class="line"><a name="l04869"></a><span class="lineno"> 4869</span> {</div> +<div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>  <span class="keywordtype">void</span>* result = VMA_NULL;</div> +<div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>  <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &&</div> +<div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>  (pAllocationCallbacks->pfnAllocation != VMA_NULL))</div> <div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>  {</div> -<div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(str);</div> -<div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>  vma_delete_array(allocs, str, len + 1);</div> -<div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>  }</div> -<div class="line"><a name="l04877"></a><span class="lineno"> 4877</span> }</div> -<div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>  </div> -<div class="line"><a name="l04879"></a><span class="lineno"> 4879</span> <span class="comment">// STL-compatible allocator.</span></div> -<div class="line"><a name="l04880"></a><span class="lineno"> 4880</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l04881"></a><span class="lineno"> 4881</span> <span class="keyword">class </span>VmaStlAllocator</div> -<div class="line"><a name="l04882"></a><span class="lineno"> 4882</span> {</div> -<div class="line"><a name="l04883"></a><span class="lineno"> 4883</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>  <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div> -<div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>  <span class="keyword">typedef</span> T value_type;</div> -<div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>  </div> -<div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>  VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div> -<div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U> VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator<U>& src) : m_pCallbacks(src.m_pCallbacks) { }</div> -<div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>  </div> -<div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>  T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray<T>(m_pCallbacks, n); }</div> -<div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>  <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div> -<div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>  </div> -<div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U></div> -<div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator<U>& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l04895"></a><span class="lineno"> 4895</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>  <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div> -<div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>  }</div> -<div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U></div> -<div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator<U>& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l04900"></a><span class="lineno"> 4900</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>  <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div> -<div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>  }</div> -<div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>  </div> -<div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>  VmaStlAllocator& operator=(<span class="keyword">const</span> VmaStlAllocator& x) = <span class="keyword">delete</span>;</div> -<div class="line"><a name="l04905"></a><span class="lineno"> 4905</span> };</div> +<div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>  result = (*pAllocationCallbacks->pfnAllocation)(</div> +<div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>  pAllocationCallbacks->pUserData,</div> +<div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>  size,</div> +<div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>  alignment,</div> +<div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>  VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div> +<div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>  }</div> +<div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>  {</div> +<div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>  result = VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div> +<div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>  }</div> +<div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>  VMA_ASSERT(result != VMA_NULL && <span class="stringliteral">"CPU memory allocation failed."</span>);</div> +<div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l04886"></a><span class="lineno"> 4886</span> }</div> +<div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>  </div> +<div class="line"><a name="l04888"></a><span class="lineno"> 4888</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l04889"></a><span class="lineno"> 4889</span> {</div> +<div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>  <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &&</div> +<div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>  (pAllocationCallbacks->pfnFree != VMA_NULL))</div> +<div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>  {</div> +<div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>  (*pAllocationCallbacks->pfnFree)(pAllocationCallbacks->pUserData, ptr);</div> +<div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>  }</div> +<div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>  {</div> +<div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>  VMA_SYSTEM_ALIGNED_FREE(ptr);</div> +<div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>  }</div> +<div class="line"><a name="l04899"></a><span class="lineno"> 4899</span> }</div> +<div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>  </div> +<div class="line"><a name="l04901"></a><span class="lineno"> 4901</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04902"></a><span class="lineno"> 4902</span> <span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div> +<div class="line"><a name="l04903"></a><span class="lineno"> 4903</span> {</div> +<div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div> +<div class="line"><a name="l04905"></a><span class="lineno"> 4905</span> }</div> <div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>  </div> -<div class="line"><a name="l04907"></a><span class="lineno"> 4907</span> <span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div> -<div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>  </div> -<div class="line"><a name="l04909"></a><span class="lineno"> 4909</span> <span class="preprocessor">#define VmaVector std::vector</span></div> -<div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>  </div> -<div class="line"><a name="l04911"></a><span class="lineno"> 4911</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> -<div class="line"><a name="l04912"></a><span class="lineno"> 4912</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& item)</div> -<div class="line"><a name="l04913"></a><span class="lineno"> 4913</span> {</div> -<div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>  vec.insert(vec.begin() + index, item);</div> -<div class="line"><a name="l04915"></a><span class="lineno"> 4915</span> }</div> +<div class="line"><a name="l04907"></a><span class="lineno"> 4907</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04908"></a><span class="lineno"> 4908</span> <span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div> +<div class="line"><a name="l04909"></a><span class="lineno"> 4909</span> {</div> +<div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div> +<div class="line"><a name="l04911"></a><span class="lineno"> 4911</span> }</div> +<div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>  </div> +<div class="line"><a name="l04913"></a><span class="lineno"> 4913</span> <span class="preprocessor">#define vma_new(allocator, type) new(VmaAllocate<type>(allocator))(type)</span></div> +<div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>  </div> +<div class="line"><a name="l04915"></a><span class="lineno"> 4915</span> <span class="preprocessor">#define vma_new_array(allocator, type, count) new(VmaAllocateArray<type>((allocator), (count)))(type)</span></div> <div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>  </div> -<div class="line"><a name="l04917"></a><span class="lineno"> 4917</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> -<div class="line"><a name="l04918"></a><span class="lineno"> 4918</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l04917"></a><span class="lineno"> 4917</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04918"></a><span class="lineno"> 4918</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div> <div class="line"><a name="l04919"></a><span class="lineno"> 4919</span> {</div> -<div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>  vec.erase(vec.begin() + index);</div> -<div class="line"><a name="l04921"></a><span class="lineno"> 4921</span> }</div> -<div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>  </div> -<div class="line"><a name="l04923"></a><span class="lineno"> 4923</span> <span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div> -<div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>  </div> -<div class="line"><a name="l04925"></a><span class="lineno"> 4925</span> <span class="comment">/* Class with interface compatible with subset of std::vector.</span></div> -<div class="line"><a name="l04926"></a><span class="lineno"> 4926</span> <span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div> -<div class="line"><a name="l04927"></a><span class="lineno"> 4927</span> <span class="comment">used for these objects. */</span></div> -<div class="line"><a name="l04928"></a><span class="lineno"> 4928</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT></div> -<div class="line"><a name="l04929"></a><span class="lineno"> 4929</span> <span class="keyword">class </span>VmaVector</div> -<div class="line"><a name="l04930"></a><span class="lineno"> 4930</span> {</div> -<div class="line"><a name="l04931"></a><span class="lineno"> 4931</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>  <span class="keyword">typedef</span> T value_type;</div> -<div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>  </div> -<div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>  VmaVector(<span class="keyword">const</span> AllocatorT& allocator) :</div> -<div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>  m_Allocator(allocator),</div> -<div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>  m_pArray(VMA_NULL),</div> -<div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>  m_Count(0),</div> -<div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>  m_Capacity(0)</div> -<div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>  {</div> -<div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>  }</div> -<div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>  </div> -<div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>  VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT& allocator) :</div> -<div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>  m_Allocator(allocator),</div> -<div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>  m_pArray(count ? (T*)VmaAllocateArray<T>(allocator.m_pCallbacks, count) : VMA_NULL),</div> -<div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>  m_Count(count),</div> -<div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>  m_Capacity(count)</div> +<div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>  ptr->~T();</div> +<div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>  VmaFree(pAllocationCallbacks, ptr);</div> +<div class="line"><a name="l04922"></a><span class="lineno"> 4922</span> }</div> +<div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>  </div> +<div class="line"><a name="l04924"></a><span class="lineno"> 4924</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04925"></a><span class="lineno"> 4925</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div> +<div class="line"><a name="l04926"></a><span class="lineno"> 4926</span> {</div> +<div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> +<div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>  {</div> +<div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div> +<div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>  {</div> +<div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>  ptr[i].~T();</div> +<div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>  }</div> +<div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>  VmaFree(pAllocationCallbacks, ptr);</div> +<div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>  }</div> +<div class="line"><a name="l04935"></a><span class="lineno"> 4935</span> }</div> +<div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>  </div> +<div class="line"><a name="l04937"></a><span class="lineno"> 4937</span> <span class="keyword">static</span> <span class="keywordtype">char</span>* VmaCreateStringCopy(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keyword">const</span> <span class="keywordtype">char</span>* srcStr)</div> +<div class="line"><a name="l04938"></a><span class="lineno"> 4938</span> {</div> +<div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>  <span class="keywordflow">if</span>(srcStr != VMA_NULL)</div> +<div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>  {</div> +<div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(srcStr);</div> +<div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>  <span class="keywordtype">char</span>* <span class="keyword">const</span> result = vma_new_array(allocs, <span class="keywordtype">char</span>, len + 1);</div> +<div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>  memcpy(result, srcStr, len + 1);</div> +<div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>  }</div> +<div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>  {</div> -<div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>  }</div> -<div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>  </div> -<div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>  <span class="comment">// This version of the constructor is here for compatibility with pre-C++14 std::vector.</span></div> -<div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>  <span class="comment">// value is unused.</span></div> -<div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>  VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> T& value, <span class="keyword">const</span> AllocatorT& allocator)</div> -<div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>  : VmaVector(count, allocator) {}</div> -<div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>  </div> -<div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>  VmaVector(<span class="keyword">const</span> VmaVector<T, AllocatorT>& src) :</div> -<div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>  m_Allocator(src.m_Allocator),</div> -<div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>  m_pArray(src.m_Count ? (T*)VmaAllocateArray<T>(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div> -<div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>  m_Count(src.m_Count),</div> -<div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>  m_Capacity(src.m_Count)</div> -<div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>  {</div> -<div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> -<div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>  {</div> -<div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>  memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>  }</div> -<div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>  }</div> -<div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>  </div> -<div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>  ~VmaVector()</div> -<div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>  {</div> -<div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> -<div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>  }</div> +<div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>  <span class="keywordflow">return</span> VMA_NULL;</div> +<div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>  }</div> +<div class="line"><a name="l04950"></a><span class="lineno"> 4950</span> }</div> +<div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>  </div> +<div class="line"><a name="l04952"></a><span class="lineno"> 4952</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFreeString(<span class="keyword">const</span> VkAllocationCallbacks* allocs, <span class="keywordtype">char</span>* str)</div> +<div class="line"><a name="l04953"></a><span class="lineno"> 4953</span> {</div> +<div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>  <span class="keywordflow">if</span>(str != VMA_NULL)</div> +<div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>  {</div> +<div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = strlen(str);</div> +<div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>  vma_delete_array(allocs, str, len + 1);</div> +<div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>  }</div> +<div class="line"><a name="l04959"></a><span class="lineno"> 4959</span> }</div> +<div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>  </div> +<div class="line"><a name="l04961"></a><span class="lineno"> 4961</span> <span class="comment">// STL-compatible allocator.</span></div> +<div class="line"><a name="l04962"></a><span class="lineno"> 4962</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l04963"></a><span class="lineno"> 4963</span> <span class="keyword">class </span>VmaStlAllocator</div> +<div class="line"><a name="l04964"></a><span class="lineno"> 4964</span> {</div> +<div class="line"><a name="l04965"></a><span class="lineno"> 4965</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>  <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div> +<div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>  <span class="keyword">typedef</span> T value_type;</div> +<div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>  </div> +<div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>  VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div> +<div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U> VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator<U>& src) : m_pCallbacks(src.m_pCallbacks) { }</div> <div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>  </div> -<div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>  VmaVector& operator=(<span class="keyword">const</span> VmaVector<T, AllocatorT>& rhs)</div> -<div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>  {</div> -<div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>  <span class="keywordflow">if</span>(&rhs != <span class="keyword">this</span>)</div> -<div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>  {</div> -<div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>  resize(rhs.m_Count);</div> -<div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> -<div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>  {</div> -<div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>  memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>  }</div> -<div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>  }</div> -<div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> -<div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>  }</div> -<div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>  </div> -<div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> -<div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> -<div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>  T* data() { <span class="keywordflow">return</span> m_pArray; }</div> -<div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>  <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div> -<div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>  </div> -<div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>  T& operator[](<span class="keywordtype">size_t</span> index)</div> -<div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>  {</div> -<div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>  <span class="keywordflow">return</span> m_pArray[index];</div> -<div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>  }</div> -<div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>  <span class="keyword">const</span> T& operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div> -<div class="line"><a name="l04996"></a><span class="lineno"> 4996</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>  <span class="keywordflow">return</span> m_pArray[index];</div> -<div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>  }</div> -<div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>  </div> -<div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>  T& front()</div> -<div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>  {</div> -<div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>  <span class="keywordflow">return</span> m_pArray[0];</div> -<div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>  }</div> -<div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>  <span class="keyword">const</span> T& front()<span class="keyword"> const</span></div> -<div class="line"><a name="l05007"></a><span class="lineno"> 5007</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>  <span class="keywordflow">return</span> m_pArray[0];</div> -<div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>  }</div> -<div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>  T& back()</div> -<div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>  {</div> -<div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>  <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div> -<div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>  }</div> -<div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>  <span class="keyword">const</span> T& back()<span class="keyword"> const</span></div> -<div class="line"><a name="l05017"></a><span class="lineno"> 5017</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>  <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div> -<div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>  }</div> -<div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>  </div> -<div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>  <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> -<div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>  {</div> -<div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>  newCapacity = VMA_MAX(newCapacity, m_Count);</div> -<div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>  </div> -<div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>  <span class="keywordflow">if</span>((newCapacity < m_Capacity) && !freeMemory)</div> -<div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>  {</div> -<div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>  newCapacity = m_Capacity;</div> -<div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>  }</div> -<div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>  </div> -<div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>  <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div> -<div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>  {</div> -<div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>  T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator, newCapacity) : VMA_NULL;</div> -<div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> -<div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>  {</div> -<div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>  memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>  }</div> -<div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> -<div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>  m_Capacity = newCapacity;</div> -<div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>  m_pArray = newArray;</div> -<div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>  }</div> -<div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>  }</div> -<div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>  </div> -<div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>  <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> -<div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>  {</div> -<div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>  <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div> -<div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>  <span class="keywordflow">if</span>(newCount > m_Capacity)</div> -<div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>  {</div> -<div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>  newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div> -<div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>  }</div> -<div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div> -<div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>  {</div> -<div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>  newCapacity = newCount;</div> -<div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>  }</div> -<div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>  </div> -<div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>  <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div> -<div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>  {</div> -<div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>  T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div> -<div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div> -<div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>  <span class="keywordflow">if</span>(elementsToCopy != 0)</div> +<div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>  T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray<T>(m_pCallbacks, n); }</div> +<div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>  <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div> +<div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>  </div> +<div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U></div> +<div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator<U>& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l04977"></a><span class="lineno"> 4977</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>  <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div> +<div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>  }</div> +<div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>  <span class="keyword">template</span><<span class="keyword">typename</span> U></div> +<div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator<U>& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l04982"></a><span class="lineno"> 4982</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>  <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div> +<div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>  }</div> +<div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>  </div> +<div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>  VmaStlAllocator& operator=(<span class="keyword">const</span> VmaStlAllocator& x) = <span class="keyword">delete</span>;</div> +<div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>  VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&) = <span class="keywordflow">default</span>;</div> +<div class="line"><a name="l04988"></a><span class="lineno"> 4988</span> };</div> +<div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>  </div> +<div class="line"><a name="l04990"></a><span class="lineno"> 4990</span> <span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div> +<div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>  </div> +<div class="line"><a name="l04992"></a><span class="lineno"> 4992</span> <span class="preprocessor">#define VmaVector std::vector</span></div> +<div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>  </div> +<div class="line"><a name="l04994"></a><span class="lineno"> 4994</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> +<div class="line"><a name="l04995"></a><span class="lineno"> 4995</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& item)</div> +<div class="line"><a name="l04996"></a><span class="lineno"> 4996</span> {</div> +<div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>  vec.insert(vec.begin() + index, item);</div> +<div class="line"><a name="l04998"></a><span class="lineno"> 4998</span> }</div> +<div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>  </div> +<div class="line"><a name="l05000"></a><span class="lineno"> 5000</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> +<div class="line"><a name="l05001"></a><span class="lineno"> 5001</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l05002"></a><span class="lineno"> 5002</span> {</div> +<div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>  vec.erase(vec.begin() + index);</div> +<div class="line"><a name="l05004"></a><span class="lineno"> 5004</span> }</div> +<div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>  </div> +<div class="line"><a name="l05006"></a><span class="lineno"> 5006</span> <span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_VECTOR</span></div> +<div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>  </div> +<div class="line"><a name="l05008"></a><span class="lineno"> 5008</span> <span class="comment">/* Class with interface compatible with subset of std::vector.</span></div> +<div class="line"><a name="l05009"></a><span class="lineno"> 5009</span> <span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div> +<div class="line"><a name="l05010"></a><span class="lineno"> 5010</span> <span class="comment">used for these objects. */</span></div> +<div class="line"><a name="l05011"></a><span class="lineno"> 5011</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT></div> +<div class="line"><a name="l05012"></a><span class="lineno"> 5012</span> <span class="keyword">class </span>VmaVector</div> +<div class="line"><a name="l05013"></a><span class="lineno"> 5013</span> {</div> +<div class="line"><a name="l05014"></a><span class="lineno"> 5014</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>  <span class="keyword">typedef</span> T value_type;</div> +<div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>  </div> +<div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>  VmaVector(<span class="keyword">const</span> AllocatorT& allocator) :</div> +<div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>  m_Allocator(allocator),</div> +<div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>  m_pArray(VMA_NULL),</div> +<div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>  m_Count(0),</div> +<div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>  m_Capacity(0)</div> +<div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>  {</div> +<div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>  }</div> +<div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>  </div> +<div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>  VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT& allocator) :</div> +<div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>  m_Allocator(allocator),</div> +<div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>  m_pArray(count ? (T*)VmaAllocateArray<T>(allocator.m_pCallbacks, count) : VMA_NULL),</div> +<div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>  m_Count(count),</div> +<div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>  m_Capacity(count)</div> +<div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>  {</div> +<div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>  }</div> +<div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>  </div> +<div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>  <span class="comment">// This version of the constructor is here for compatibility with pre-C++14 std::vector.</span></div> +<div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>  <span class="comment">// value is unused.</span></div> +<div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>  VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> T& value, <span class="keyword">const</span> AllocatorT& allocator)</div> +<div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>  : VmaVector(count, allocator) {}</div> +<div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>  </div> +<div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>  VmaVector(<span class="keyword">const</span> VmaVector<T, AllocatorT>& src) :</div> +<div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>  m_Allocator(src.m_Allocator),</div> +<div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>  m_pArray(src.m_Count ? (T*)VmaAllocateArray<T>(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div> +<div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>  m_Count(src.m_Count),</div> +<div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>  m_Capacity(src.m_Count)</div> +<div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>  {</div> +<div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> +<div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>  {</div> +<div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>  memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>  }</div> +<div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>  }</div> +<div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>  </div> +<div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>  ~VmaVector()</div> +<div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>  {</div> +<div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> +<div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>  }</div> +<div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>  </div> +<div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>  VmaVector& operator=(<span class="keyword">const</span> VmaVector<T, AllocatorT>& rhs)</div> +<div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>  {</div> +<div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>  <span class="keywordflow">if</span>(&rhs != <span class="keyword">this</span>)</div> +<div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>  {</div> +<div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>  resize(rhs.m_Count);</div> +<div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> <div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>  {</div> -<div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>  memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>  memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> <div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>  }</div> -<div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> -<div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>  m_Capacity = newCapacity;</div> -<div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>  m_pArray = newArray;</div> -<div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>  }</div> -<div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>  </div> -<div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>  m_Count = newCount;</div> -<div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>  }</div> -<div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>  </div> -<div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>  <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> -<div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>  {</div> -<div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>  resize(0, freeMemory);</div> -<div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>  }</div> -<div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>  </div> -<div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>  <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>  {</div> -<div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>  VMA_HEAVY_ASSERT(index <= m_Count);</div> -<div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> -<div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>  resize(oldCount + 1);</div> -<div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>  <span class="keywordflow">if</span>(index < oldCount)</div> -<div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>  {</div> -<div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>  memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>  }</div> -<div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>  m_pArray[index] = src;</div> -<div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>  }</div> -<div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>  </div> -<div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>  <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div> -<div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>  {</div> -<div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> -<div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>  <span class="keywordflow">if</span>(index < oldCount - 1)</div> -<div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>  {</div> -<div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>  memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>  }</div> -<div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>  resize(oldCount - 1);</div> +<div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>  }</div> +<div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>  }</div> +<div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>  </div> +<div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> +<div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> +<div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>  T* data() { <span class="keywordflow">return</span> m_pArray; }</div> +<div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>  <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div> +<div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>  </div> +<div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>  T& operator[](<span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>  {</div> +<div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>  <span class="keywordflow">return</span> m_pArray[index];</div> +<div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>  }</div> +<div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>  <span class="keyword">const</span> T& operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div> +<div class="line"><a name="l05079"></a><span class="lineno"> 5079</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>  <span class="keywordflow">return</span> m_pArray[index];</div> +<div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>  }</div> +<div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>  </div> +<div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>  T& front()</div> +<div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>  {</div> +<div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>  <span class="keywordflow">return</span> m_pArray[0];</div> +<div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>  }</div> +<div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>  <span class="keyword">const</span> T& front()<span class="keyword"> const</span></div> +<div class="line"><a name="l05090"></a><span class="lineno"> 5090</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>  <span class="keywordflow">return</span> m_pArray[0];</div> +<div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>  }</div> +<div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>  T& back()</div> +<div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>  {</div> +<div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>  <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div> <div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>  }</div> -<div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>  </div> -<div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>  {</div> -<div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div> -<div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>  resize(newIndex + 1);</div> -<div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>  m_pArray[newIndex] = src;</div> -<div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>  }</div> -<div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>  </div> -<div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>  <span class="keywordtype">void</span> pop_back()</div> -<div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>  {</div> -<div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>  resize(size() - 1);</div> -<div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>  }</div> -<div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>  </div> -<div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>  <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>  {</div> -<div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>  insert(0, src);</div> -<div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>  }</div> -<div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>  </div> -<div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>  <span class="keywordtype">void</span> pop_front()</div> -<div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>  {</div> -<div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>  remove(0);</div> -<div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>  }</div> -<div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>  </div> -<div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>  <span class="keyword">typedef</span> T* iterator;</div> -<div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>  </div> -<div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>  iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div> -<div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>  iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div> -<div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>  </div> -<div class="line"><a name="l05129"></a><span class="lineno"> 5129</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>  AllocatorT m_Allocator;</div> -<div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>  T* m_pArray;</div> -<div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>  <span class="keywordtype">size_t</span> m_Count;</div> -<div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>  <span class="keywordtype">size_t</span> m_Capacity;</div> -<div class="line"><a name="l05134"></a><span class="lineno"> 5134</span> };</div> -<div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>  </div> -<div class="line"><a name="l05136"></a><span class="lineno"> 5136</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> -<div class="line"><a name="l05137"></a><span class="lineno"> 5137</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& item)</div> -<div class="line"><a name="l05138"></a><span class="lineno"> 5138</span> {</div> -<div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>  vec.insert(index, item);</div> -<div class="line"><a name="l05140"></a><span class="lineno"> 5140</span> }</div> -<div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>  </div> -<div class="line"><a name="l05142"></a><span class="lineno"> 5142</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> -<div class="line"><a name="l05143"></a><span class="lineno"> 5143</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index)</div> -<div class="line"><a name="l05144"></a><span class="lineno"> 5144</span> {</div> -<div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>  vec.remove(index);</div> -<div class="line"><a name="l05146"></a><span class="lineno"> 5146</span> }</div> +<div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>  <span class="keyword">const</span> T& back()<span class="keyword"> const</span></div> +<div class="line"><a name="l05100"></a><span class="lineno"> 5100</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>  <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div> +<div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>  }</div> +<div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>  </div> +<div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>  <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> +<div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>  {</div> +<div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>  newCapacity = VMA_MAX(newCapacity, m_Count);</div> +<div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>  </div> +<div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>  <span class="keywordflow">if</span>((newCapacity < m_Capacity) && !freeMemory)</div> +<div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>  {</div> +<div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>  newCapacity = m_Capacity;</div> +<div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>  }</div> +<div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>  </div> +<div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>  <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div> +<div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>  {</div> +<div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>  T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator, newCapacity) : VMA_NULL;</div> +<div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>  <span class="keywordflow">if</span>(m_Count != 0)</div> +<div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>  {</div> +<div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>  memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>  }</div> +<div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> +<div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>  m_Capacity = newCapacity;</div> +<div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>  m_pArray = newArray;</div> +<div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>  }</div> +<div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>  }</div> +<div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>  </div> +<div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>  <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount)</div> +<div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>  {</div> +<div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>  <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div> +<div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>  <span class="keywordflow">if</span>(newCount > m_Capacity)</div> +<div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>  {</div> +<div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>  newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div> +<div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>  }</div> +<div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>  </div> +<div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>  <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div> +<div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>  {</div> +<div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>  T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray<T>(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div> +<div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div> +<div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>  <span class="keywordflow">if</span>(elementsToCopy != 0)</div> +<div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>  {</div> +<div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>  memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>  }</div> +<div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> +<div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>  m_Capacity = newCapacity;</div> +<div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>  m_pArray = newArray;</div> +<div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>  }</div> <div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>  </div> -<div class="line"><a name="l05148"></a><span class="lineno"> 5148</span> <span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div> -<div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>  </div> -<div class="line"><a name="l05150"></a><span class="lineno"> 5150</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT></div> -<div class="line"><a name="l05151"></a><span class="lineno"> 5151</span> <span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT& vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type& value)</div> -<div class="line"><a name="l05152"></a><span class="lineno"> 5152</span> {</div> -<div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>  vector.data(),</div> -<div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>  vector.data() + vector.size(),</div> -<div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>  value,</div> -<div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>  CmpLess()) - vector.data();</div> -<div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>  VmaVectorInsert(vector, indexToInsert, value);</div> -<div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>  <span class="keywordflow">return</span> indexToInsert;</div> -<div class="line"><a name="l05160"></a><span class="lineno"> 5160</span> }</div> -<div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>  </div> -<div class="line"><a name="l05162"></a><span class="lineno"> 5162</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT></div> -<div class="line"><a name="l05163"></a><span class="lineno"> 5163</span> <span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT& vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type& value)</div> -<div class="line"><a name="l05164"></a><span class="lineno"> 5164</span> {</div> -<div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>  CmpLess comparator;</div> -<div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>  <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>  vector.begin(),</div> -<div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>  vector.end(),</div> -<div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>  value,</div> -<div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>  comparator);</div> -<div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>  <span class="keywordflow">if</span>((it != vector.end()) && !comparator(*it, value) && !comparator(value, *it))</div> -<div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>  {</div> -<div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>  <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div> -<div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>  VmaVectorRemove(vector, indexToRemove);</div> -<div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>  }</div> -<div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l05178"></a><span class="lineno"> 5178</span> }</div> -<div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>  </div> -<div class="line"><a name="l05181"></a><span class="lineno"> 5181</span> <span class="comment">// class VmaSmallVector</span></div> -<div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>  </div> -<div class="line"><a name="l05183"></a><span class="lineno"> 5183</span> <span class="comment">/*</span></div> -<div class="line"><a name="l05184"></a><span class="lineno"> 5184</span> <span class="comment">This is a vector (a variable-sized array), optimized for the case when the array is small.</span></div> -<div class="line"><a name="l05185"></a><span class="lineno"> 5185</span> <span class="comment"></span> </div> -<div class="line"><a name="l05186"></a><span class="lineno"> 5186</span> <span class="comment">It contains some number of elements in-place, which allows it to avoid heap allocation</span></div> -<div class="line"><a name="l05187"></a><span class="lineno"> 5187</span> <span class="comment">when the actual number of elements is below that threshold. This allows normal "small"</span></div> -<div class="line"><a name="l05188"></a><span class="lineno"> 5188</span> <span class="comment">cases to be fast without losing generality for large inputs.</span></div> -<div class="line"><a name="l05189"></a><span class="lineno"> 5189</span> <span class="comment">*/</span></div> -<div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>  </div> -<div class="line"><a name="l05191"></a><span class="lineno"> 5191</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT, <span class="keywordtype">size_t</span> N></div> -<div class="line"><a name="l05192"></a><span class="lineno"> 5192</span> <span class="keyword">class </span>VmaSmallVector</div> -<div class="line"><a name="l05193"></a><span class="lineno"> 5193</span> {</div> -<div class="line"><a name="l05194"></a><span class="lineno"> 5194</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>  <span class="keyword">typedef</span> T value_type;</div> -<div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>  </div> -<div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>  VmaSmallVector(<span class="keyword">const</span> AllocatorT& allocator) :</div> -<div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>  m_Count(0),</div> -<div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>  m_DynamicArray(allocator)</div> -<div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>  {</div> -<div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>  }</div> -<div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>  VmaSmallVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT& allocator) :</div> -<div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>  m_Count(count),</div> -<div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>  m_DynamicArray(count > N ? count : 0, allocator)</div> -<div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>  {</div> +<div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>  m_Count = newCount;</div> +<div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>  }</div> +<div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>  </div> +<div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>  <span class="keywordtype">void</span> clear()</div> +<div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>  {</div> +<div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>  resize(0);</div> +<div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>  }</div> +<div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>  </div> +<div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>  <span class="keywordtype">void</span> shrink_to_fit()</div> +<div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>  {</div> +<div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>  <span class="keywordflow">if</span>(m_Capacity > m_Count)</div> +<div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>  {</div> +<div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>  T* newArray = VMA_NULL;</div> +<div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>  <span class="keywordflow">if</span>(m_Count > 0)</div> +<div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>  {</div> +<div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>  newArray = VmaAllocateArray<T>(m_Allocator.m_pCallbacks, m_Count);</div> +<div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>  memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>  }</div> +<div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>  VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div> +<div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>  m_Capacity = m_Count;</div> +<div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>  m_pArray = newArray;</div> +<div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>  }</div> +<div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>  }</div> +<div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>  </div> +<div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>  <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>  {</div> +<div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>  VMA_HEAVY_ASSERT(index <= m_Count);</div> +<div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> +<div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>  resize(oldCount + 1);</div> +<div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>  <span class="keywordflow">if</span>(index < oldCount)</div> +<div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>  {</div> +<div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>  memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>  }</div> +<div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>  m_pArray[index] = src;</div> +<div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>  }</div> +<div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>  </div> +<div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>  <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>  {</div> +<div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> +<div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>  <span class="keywordflow">if</span>(index < oldCount - 1)</div> +<div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>  {</div> +<div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>  memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>  }</div> +<div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>  resize(oldCount - 1);</div> +<div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>  }</div> +<div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>  </div> +<div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>  {</div> +<div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div> +<div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>  resize(newIndex + 1);</div> +<div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>  m_pArray[newIndex] = src;</div> +<div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>  }</div> +<div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>  </div> +<div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>  <span class="keywordtype">void</span> pop_back()</div> +<div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>  {</div> +<div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>  resize(size() - 1);</div> <div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>  }</div> -<div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>  <span class="keyword">template</span><<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN></div> -<div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>  VmaSmallVector(<span class="keyword">const</span> VmaSmallVector<SrcT, SrcAllocatorT, SrcN>& src) = <span class="keyword">delete</span>;</div> -<div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>  <span class="keyword">template</span><<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN></div> -<div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>  VmaSmallVector<T, AllocatorT, N>& operator=(<span class="keyword">const</span> VmaSmallVector<SrcT, SrcAllocatorT, SrcN>& rhs) = <span class="keyword">delete</span>;</div> -<div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>  </div> -<div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> -<div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> -<div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>  T* data() { <span class="keywordflow">return</span> m_Count > N ? m_DynamicArray.data() : m_StaticArray; }</div> -<div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>  <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count > N ? m_DynamicArray.data() : m_StaticArray; }</div> -<div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>  </div> -<div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>  T& operator[](<span class="keywordtype">size_t</span> index)</div> -<div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>  {</div> -<div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>  <span class="keywordflow">return</span> data()[index];</div> -<div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>  }</div> -<div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>  <span class="keyword">const</span> T& operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div> -<div class="line"><a name="l05223"></a><span class="lineno"> 5223</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>  <span class="keywordflow">return</span> data()[index];</div> -<div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>  }</div> -<div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>  </div> -<div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>  T& front()</div> -<div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>  {</div> -<div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>  <span class="keywordflow">return</span> data()[0];</div> -<div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>  }</div> -<div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>  <span class="keyword">const</span> T& front()<span class="keyword"> const</span></div> -<div class="line"><a name="l05234"></a><span class="lineno"> 5234</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>  <span class="keywordflow">return</span> data()[0];</div> -<div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>  }</div> -<div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>  T& back()</div> -<div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>  {</div> -<div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>  <span class="keywordflow">return</span> data()[m_Count - 1];</div> -<div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>  }</div> -<div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>  <span class="keyword">const</span> T& back()<span class="keyword"> const</span></div> -<div class="line"><a name="l05244"></a><span class="lineno"> 5244</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>  <span class="keywordflow">return</span> data()[m_Count - 1];</div> -<div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>  }</div> -<div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>  </div> -<div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>  <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> -<div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>  {</div> -<div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>  <span class="keywordflow">if</span>(newCount > N && m_Count > N)</div> -<div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>  {</div> -<div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>  <span class="comment">// Any direction, staying in m_DynamicArray</span></div> -<div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>  m_DynamicArray.resize(newCount, freeMemory);</div> -<div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>  }</div> -<div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount > N && m_Count <= N)</div> -<div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>  {</div> -<div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>  <span class="comment">// Growing, moving from m_StaticArray to m_DynamicArray</span></div> -<div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>  m_DynamicArray.resize(newCount, freeMemory);</div> -<div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>  <span class="keywordflow">if</span>(m_Count > 0)</div> -<div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>  {</div> -<div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>  memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>  }</div> -<div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>  }</div> -<div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount <= N && m_Count > N)</div> -<div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>  {</div> -<div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>  <span class="comment">// Shrinking, moving from m_DynamicArray to m_StaticArray</span></div> -<div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>  <span class="keywordflow">if</span>(newCount > 0)</div> -<div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>  {</div> -<div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>  memcpy(m_StaticArray, m_DynamicArray.data(), newCount * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>  }</div> -<div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>  m_DynamicArray.resize(0, freeMemory);</div> -<div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>  }</div> -<div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>  {</div> -<div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>  <span class="comment">// Any direction, staying in m_StaticArray - nothing to do here</span></div> -<div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>  }</div> -<div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>  m_Count = newCount;</div> -<div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>  }</div> -<div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>  </div> -<div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>  <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> -<div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>  {</div> -<div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>  m_DynamicArray.clear(freeMemory);</div> -<div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>  m_Count = 0;</div> -<div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>  }</div> -<div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>  </div> -<div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>  <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>  {</div> -<div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>  VMA_HEAVY_ASSERT(index <= m_Count);</div> -<div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> -<div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>  resize(oldCount + 1);</div> -<div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>  T* <span class="keyword">const</span> dataPtr = data();</div> -<div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>  <span class="keywordflow">if</span>(index < oldCount)</div> -<div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>  {</div> -<div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>  <span class="comment">// I know, this could be more optimal for case where memmove can be memcpy directly from m_StaticArray to m_DynamicArray.</span></div> -<div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>  memmove(dataPtr + (index + 1), dataPtr + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>  }</div> -<div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>  dataPtr[index] = src;</div> -<div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>  }</div> -<div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>  </div> -<div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>  <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div> -<div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>  {</div> -<div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> -<div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> -<div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>  <span class="keywordflow">if</span>(index < oldCount - 1)</div> -<div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>  {</div> -<div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>  <span class="comment">// I know, this could be more optimal for case where memmove can be memcpy directly from m_DynamicArray to m_StaticArray.</span></div> -<div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>  T* <span class="keyword">const</span> dataPtr = data();</div> -<div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>  memmove(dataPtr + index, dataPtr + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>  }</div> -<div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>  resize(oldCount - 1);</div> -<div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>  }</div> -<div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>  </div> -<div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>  {</div> -<div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div> -<div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>  resize(newIndex + 1);</div> -<div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>  data()[newIndex] = src;</div> -<div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>  }</div> -<div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>  </div> -<div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>  <span class="keywordtype">void</span> pop_back()</div> -<div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>  {</div> -<div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>  resize(size() - 1);</div> -<div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>  }</div> -<div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>  </div> -<div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>  <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T& src)</div> -<div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>  {</div> -<div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>  insert(0, src);</div> -<div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>  }</div> -<div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>  </div> -<div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>  <span class="keywordtype">void</span> pop_front()</div> -<div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>  {</div> -<div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>  remove(0);</div> -<div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>  }</div> -<div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>  </div> -<div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>  <span class="keyword">typedef</span> T* iterator;</div> -<div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>  </div> -<div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>  iterator begin() { <span class="keywordflow">return</span> data(); }</div> -<div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>  iterator end() { <span class="keywordflow">return</span> data() + m_Count; }</div> -<div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>  </div> -<div class="line"><a name="l05343"></a><span class="lineno"> 5343</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>  <span class="keywordtype">size_t</span> m_Count;</div> -<div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>  T m_StaticArray[N]; <span class="comment">// Used when m_Size <= N</span></div> -<div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>  VmaVector<T, AllocatorT> m_DynamicArray; <span class="comment">// Used when m_Size > N</span></div> -<div class="line"><a name="l05347"></a><span class="lineno"> 5347</span> };</div> -<div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>  </div> -<div class="line"><a name="l05350"></a><span class="lineno"> 5350</span> <span class="comment">// class VmaPoolAllocator</span></div> -<div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>  </div> -<div class="line"><a name="l05352"></a><span class="lineno"> 5352</span> <span class="comment">/*</span></div> -<div class="line"><a name="l05353"></a><span class="lineno"> 5353</span> <span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div> -<div class="line"><a name="l05354"></a><span class="lineno"> 5354</span> <span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div> -<div class="line"><a name="l05355"></a><span class="lineno"> 5355</span> <span class="comment">allocator can create multiple blocks.</span></div> -<div class="line"><a name="l05356"></a><span class="lineno"> 5356</span> <span class="comment">*/</span></div> -<div class="line"><a name="l05357"></a><span class="lineno"> 5357</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05358"></a><span class="lineno"> 5358</span> <span class="keyword">class </span>VmaPoolAllocator</div> -<div class="line"><a name="l05359"></a><span class="lineno"> 5359</span> {</div> -<div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>  VMA_CLASS_NO_COPY(VmaPoolAllocator)</div> -<div class="line"><a name="l05361"></a><span class="lineno"> 5361</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>  VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div> -<div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>  ~VmaPoolAllocator();</div> -<div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>  <span class="keyword">template</span><<span class="keyword">typename</span>... Types> T* Alloc(Types... args);</div> -<div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>  <span class="keywordtype">void</span> Free(T* ptr);</div> -<div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>  </div> -<div class="line"><a name="l05367"></a><span class="lineno"> 5367</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>  <span class="keyword">union </span>Item</div> -<div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>  {</div> -<div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>  uint32_t NextFreeIndex;</div> -<div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>  <span class="keyword">alignas</span>(T) <span class="keywordtype">char</span> Value[<span class="keyword">sizeof</span>(T)];</div> -<div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>  };</div> -<div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>  </div> -<div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>  <span class="keyword">struct </span>ItemBlock</div> -<div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>  {</div> -<div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>  Item* pItems;</div> -<div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>  uint32_t Capacity;</div> -<div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>  uint32_t FirstFreeIndex;</div> -<div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>  };</div> -<div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>  </div> -<div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>  <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div> -<div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>  <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div> -<div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>  VmaVector< ItemBlock, VmaStlAllocator<ItemBlock> > m_ItemBlocks;</div> -<div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>  </div> -<div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>  ItemBlock& CreateNewBlock();</div> -<div class="line"><a name="l05386"></a><span class="lineno"> 5386</span> };</div> -<div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>  </div> -<div class="line"><a name="l05388"></a><span class="lineno"> 5388</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05389"></a><span class="lineno"> 5389</span> VmaPoolAllocator<T>::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div> -<div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>  m_pAllocationCallbacks(pAllocationCallbacks),</div> -<div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>  m_FirstBlockCapacity(firstBlockCapacity),</div> -<div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>  m_ItemBlocks(VmaStlAllocator<ItemBlock>(pAllocationCallbacks))</div> -<div class="line"><a name="l05393"></a><span class="lineno"> 5393</span> {</div> -<div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>  VMA_ASSERT(m_FirstBlockCapacity > 1);</div> -<div class="line"><a name="l05395"></a><span class="lineno"> 5395</span> }</div> -<div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>  </div> -<div class="line"><a name="l05397"></a><span class="lineno"> 5397</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05398"></a><span class="lineno"> 5398</span> VmaPoolAllocator<T>::~VmaPoolAllocator()</div> -<div class="line"><a name="l05399"></a><span class="lineno"> 5399</span> {</div> -<div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> -<div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>  vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div> -<div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>  m_ItemBlocks.clear();</div> -<div class="line"><a name="l05403"></a><span class="lineno"> 5403</span> }</div> -<div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>  </div> -<div class="line"><a name="l05405"></a><span class="lineno"> 5405</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05406"></a><span class="lineno"> 5406</span> <span class="keyword">template</span><<span class="keyword">typename</span>... Types> T* VmaPoolAllocator<T>::Alloc(Types... args)</div> -<div class="line"><a name="l05407"></a><span class="lineno"> 5407</span> {</div> -<div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> +<div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>  </div> +<div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>  <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>  {</div> +<div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>  insert(0, src);</div> +<div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>  }</div> +<div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>  </div> +<div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>  <span class="keywordtype">void</span> pop_front()</div> +<div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>  {</div> +<div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>  remove(0);</div> +<div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>  }</div> +<div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>  </div> +<div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>  <span class="keyword">typedef</span> T* iterator;</div> +<div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>  </div> +<div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>  iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div> +<div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>  iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div> +<div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>  </div> +<div class="line"><a name="l05224"></a><span class="lineno"> 5224</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>  AllocatorT m_Allocator;</div> +<div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>  T* m_pArray;</div> +<div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>  <span class="keywordtype">size_t</span> m_Count;</div> +<div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>  <span class="keywordtype">size_t</span> m_Capacity;</div> +<div class="line"><a name="l05229"></a><span class="lineno"> 5229</span> };</div> +<div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>  </div> +<div class="line"><a name="l05231"></a><span class="lineno"> 5231</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> +<div class="line"><a name="l05232"></a><span class="lineno"> 5232</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& item)</div> +<div class="line"><a name="l05233"></a><span class="lineno"> 5233</span> {</div> +<div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>  vec.insert(index, item);</div> +<div class="line"><a name="l05235"></a><span class="lineno"> 5235</span> }</div> +<div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>  </div> +<div class="line"><a name="l05237"></a><span class="lineno"> 5237</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT></div> +<div class="line"><a name="l05238"></a><span class="lineno"> 5238</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector<T, allocatorT>& vec, <span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l05239"></a><span class="lineno"> 5239</span> {</div> +<div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>  vec.remove(index);</div> +<div class="line"><a name="l05241"></a><span class="lineno"> 5241</span> }</div> +<div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>  </div> +<div class="line"><a name="l05243"></a><span class="lineno"> 5243</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_VECTOR</span></div> +<div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>  </div> +<div class="line"><a name="l05245"></a><span class="lineno"> 5245</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT></div> +<div class="line"><a name="l05246"></a><span class="lineno"> 5246</span> <span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT& vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type& value)</div> +<div class="line"><a name="l05247"></a><span class="lineno"> 5247</span> {</div> +<div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>  vector.data(),</div> +<div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>  vector.data() + vector.size(),</div> +<div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>  value,</div> +<div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>  CmpLess()) - vector.data();</div> +<div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>  VmaVectorInsert(vector, indexToInsert, value);</div> +<div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>  <span class="keywordflow">return</span> indexToInsert;</div> +<div class="line"><a name="l05255"></a><span class="lineno"> 5255</span> }</div> +<div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>  </div> +<div class="line"><a name="l05257"></a><span class="lineno"> 5257</span> <span class="keyword">template</span><<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT></div> +<div class="line"><a name="l05258"></a><span class="lineno"> 5258</span> <span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT& vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type& value)</div> +<div class="line"><a name="l05259"></a><span class="lineno"> 5259</span> {</div> +<div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>  CmpLess comparator;</div> +<div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>  <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>  vector.begin(),</div> +<div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>  vector.end(),</div> +<div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>  value,</div> +<div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>  comparator);</div> +<div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>  <span class="keywordflow">if</span>((it != vector.end()) && !comparator(*it, value) && !comparator(value, *it))</div> +<div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>  {</div> +<div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>  <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div> +<div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>  VmaVectorRemove(vector, indexToRemove);</div> +<div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>  }</div> +<div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l05273"></a><span class="lineno"> 5273</span> }</div> +<div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>  </div> +<div class="line"><a name="l05276"></a><span class="lineno"> 5276</span> <span class="comment">// class VmaSmallVector</span></div> +<div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>  </div> +<div class="line"><a name="l05278"></a><span class="lineno"> 5278</span> <span class="comment">/*</span></div> +<div class="line"><a name="l05279"></a><span class="lineno"> 5279</span> <span class="comment">This is a vector (a variable-sized array), optimized for the case when the array is small.</span></div> +<div class="line"><a name="l05280"></a><span class="lineno"> 5280</span> <span class="comment"></span> </div> +<div class="line"><a name="l05281"></a><span class="lineno"> 5281</span> <span class="comment">It contains some number of elements in-place, which allows it to avoid heap allocation</span></div> +<div class="line"><a name="l05282"></a><span class="lineno"> 5282</span> <span class="comment">when the actual number of elements is below that threshold. This allows normal "small"</span></div> +<div class="line"><a name="l05283"></a><span class="lineno"> 5283</span> <span class="comment">cases to be fast without losing generality for large inputs.</span></div> +<div class="line"><a name="l05284"></a><span class="lineno"> 5284</span> <span class="comment">*/</span></div> +<div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>  </div> +<div class="line"><a name="l05286"></a><span class="lineno"> 5286</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT, <span class="keywordtype">size_t</span> N></div> +<div class="line"><a name="l05287"></a><span class="lineno"> 5287</span> <span class="keyword">class </span>VmaSmallVector</div> +<div class="line"><a name="l05288"></a><span class="lineno"> 5288</span> {</div> +<div class="line"><a name="l05289"></a><span class="lineno"> 5289</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>  <span class="keyword">typedef</span> T value_type;</div> +<div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>  </div> +<div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>  VmaSmallVector(<span class="keyword">const</span> AllocatorT& allocator) :</div> +<div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>  m_Count(0),</div> +<div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>  m_DynamicArray(allocator)</div> +<div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>  {</div> +<div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>  }</div> +<div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>  VmaSmallVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT& allocator) :</div> +<div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>  m_Count(count),</div> +<div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>  m_DynamicArray(count > N ? count : 0, allocator)</div> +<div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>  {</div> +<div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>  }</div> +<div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>  <span class="keyword">template</span><<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN></div> +<div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>  VmaSmallVector(<span class="keyword">const</span> VmaSmallVector<SrcT, SrcAllocatorT, SrcN>& src) = <span class="keyword">delete</span>;</div> +<div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>  <span class="keyword">template</span><<span class="keyword">typename</span> SrcT, <span class="keyword">typename</span> SrcAllocatorT, <span class="keywordtype">size_t</span> SrcN></div> +<div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>  VmaSmallVector<T, AllocatorT, N>& operator=(<span class="keyword">const</span> VmaSmallVector<SrcT, SrcAllocatorT, SrcN>& rhs) = <span class="keyword">delete</span>;</div> +<div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>  </div> +<div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> +<div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> +<div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>  T* data() { <span class="keywordflow">return</span> m_Count > N ? m_DynamicArray.data() : m_StaticArray; }</div> +<div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>  <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count > N ? m_DynamicArray.data() : m_StaticArray; }</div> +<div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>  </div> +<div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>  T& operator[](<span class="keywordtype">size_t</span> index)</div> +<div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>  {</div> +<div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>  <span class="keywordflow">return</span> data()[index];</div> +<div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>  }</div> +<div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>  <span class="keyword">const</span> T& operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div> +<div class="line"><a name="l05318"></a><span class="lineno"> 5318</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>  <span class="keywordflow">return</span> data()[index];</div> +<div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>  }</div> +<div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>  </div> +<div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>  T& front()</div> +<div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>  {</div> +<div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>  <span class="keywordflow">return</span> data()[0];</div> +<div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>  }</div> +<div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>  <span class="keyword">const</span> T& front()<span class="keyword"> const</span></div> +<div class="line"><a name="l05329"></a><span class="lineno"> 5329</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>  <span class="keywordflow">return</span> data()[0];</div> +<div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>  }</div> +<div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>  T& back()</div> +<div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>  {</div> +<div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>  <span class="keywordflow">return</span> data()[m_Count - 1];</div> +<div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>  }</div> +<div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>  <span class="keyword">const</span> T& back()<span class="keyword"> const</span></div> +<div class="line"><a name="l05339"></a><span class="lineno"> 5339</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>  <span class="keywordflow">return</span> data()[m_Count - 1];</div> +<div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>  }</div> +<div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>  </div> +<div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>  <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> +<div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>  {</div> +<div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>  <span class="keywordflow">if</span>(newCount > N && m_Count > N)</div> +<div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>  {</div> +<div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>  <span class="comment">// Any direction, staying in m_DynamicArray</span></div> +<div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>  m_DynamicArray.resize(newCount);</div> +<div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>  <span class="keywordflow">if</span>(freeMemory)</div> +<div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>  {</div> +<div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>  m_DynamicArray.shrink_to_fit();</div> +<div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>  }</div> +<div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>  }</div> +<div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount > N && m_Count <= N)</div> +<div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>  {</div> +<div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>  <span class="comment">// Growing, moving from m_StaticArray to m_DynamicArray</span></div> +<div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>  m_DynamicArray.resize(newCount);</div> +<div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>  <span class="keywordflow">if</span>(m_Count > 0)</div> +<div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>  {</div> +<div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>  memcpy(m_DynamicArray.data(), m_StaticArray, m_Count * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>  }</div> +<div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>  }</div> +<div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(newCount <= N && m_Count > N)</div> +<div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>  {</div> +<div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>  <span class="comment">// Shrinking, moving from m_DynamicArray to m_StaticArray</span></div> +<div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>  <span class="keywordflow">if</span>(newCount > 0)</div> +<div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>  {</div> +<div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>  memcpy(m_StaticArray, m_DynamicArray.data(), newCount * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>  }</div> +<div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>  m_DynamicArray.resize(0);</div> +<div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>  <span class="keywordflow">if</span>(freeMemory)</div> +<div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>  {</div> +<div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>  m_DynamicArray.shrink_to_fit();</div> +<div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>  }</div> +<div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>  }</div> +<div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>  {</div> +<div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>  <span class="comment">// Any direction, staying in m_StaticArray - nothing to do here</span></div> +<div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>  }</div> +<div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>  m_Count = newCount;</div> +<div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>  }</div> +<div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>  </div> +<div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>  <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div> +<div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>  {</div> +<div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>  m_DynamicArray.clear();</div> +<div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>  <span class="keywordflow">if</span>(freeMemory)</div> +<div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>  {</div> +<div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>  m_DynamicArray.shrink_to_fit();</div> +<div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>  }</div> +<div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>  m_Count = 0;</div> +<div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>  }</div> +<div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>  </div> +<div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>  <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>  {</div> +<div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>  VMA_HEAVY_ASSERT(index <= m_Count);</div> +<div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> +<div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>  resize(oldCount + 1);</div> +<div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>  T* <span class="keyword">const</span> dataPtr = data();</div> +<div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>  <span class="keywordflow">if</span>(index < oldCount)</div> +<div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>  {</div> +<div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>  <span class="comment">// I know, this could be more optimal for case where memmove can be memcpy directly from m_StaticArray to m_DynamicArray.</span></div> +<div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>  memmove(dataPtr + (index + 1), dataPtr + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>  }</div> +<div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>  dataPtr[index] = src;</div> +<div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>  }</div> +<div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>  </div> +<div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>  <span class="keywordtype">void</span> remove(<span class="keywordtype">size_t</span> index)</div> <div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>  {</div> -<div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>  ItemBlock& block = m_ItemBlocks[i];</div> -<div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>  <span class="comment">// This block has some free items: Use first one.</span></div> -<div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>  <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div> +<div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>  VMA_HEAVY_ASSERT(index < m_Count);</div> +<div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div> +<div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>  <span class="keywordflow">if</span>(index < oldCount - 1)</div> <div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>  {</div> -<div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>  Item* <span class="keyword">const</span> pItem = &block.pItems[block.FirstFreeIndex];</div> -<div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>  block.FirstFreeIndex = pItem->NextFreeIndex;</div> -<div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>  T* result = (T*)&pItem->Value;</div> -<div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>  <span class="keyword">new</span>(result)T(std::forward<Types>(args)...); <span class="comment">// Explicit constructor call.</span></div> -<div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>  }</div> -<div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>  }</div> -<div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>  </div> -<div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>  <span class="comment">// No block has free item: Create new one and use it.</span></div> -<div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>  ItemBlock& newBlock = CreateNewBlock();</div> -<div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>  Item* <span class="keyword">const</span> pItem = &newBlock.pItems[0];</div> -<div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>  newBlock.FirstFreeIndex = pItem->NextFreeIndex;</div> -<div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>  T* result = (T*)&pItem->Value;</div> -<div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>  <span class="keyword">new</span>(result)T(std::forward<Types>(args)...); <span class="comment">// Explicit constructor call.</span></div> -<div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05429"></a><span class="lineno"> 5429</span> }</div> -<div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>  </div> -<div class="line"><a name="l05431"></a><span class="lineno"> 5431</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05432"></a><span class="lineno"> 5432</span> <span class="keywordtype">void</span> VmaPoolAllocator<T>::Free(T* ptr)</div> -<div class="line"><a name="l05433"></a><span class="lineno"> 5433</span> {</div> -<div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>  <span class="comment">// Search all memory blocks to find ptr.</span></div> -<div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> -<div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>  {</div> -<div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>  ItemBlock& block = m_ItemBlocks[i];</div> -<div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>  </div> -<div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>  <span class="comment">// Casting to union.</span></div> -<div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>  Item* pItemPtr;</div> -<div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>  memcpy(&pItemPtr, &ptr, <span class="keyword">sizeof</span>(pItemPtr));</div> -<div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>  </div> -<div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>  <span class="comment">// Check if pItemPtr is in address range of this block.</span></div> -<div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>  <span class="keywordflow">if</span>((pItemPtr >= block.pItems) && (pItemPtr < block.pItems + block.Capacity))</div> -<div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>  {</div> -<div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>  ptr->~T(); <span class="comment">// Explicit destructor call.</span></div> -<div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>  <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(pItemPtr - block.pItems);</div> -<div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>  pItemPtr->NextFreeIndex = block.FirstFreeIndex;</div> -<div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>  block.FirstFreeIndex = index;</div> -<div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>  }</div> -<div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>  }</div> -<div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>  VMA_ASSERT(0 && <span class="stringliteral">"Pointer doesn't belong to this memory pool."</span>);</div> -<div class="line"><a name="l05454"></a><span class="lineno"> 5454</span> }</div> +<div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>  <span class="comment">// I know, this could be more optimal for case where memmove can be memcpy directly from m_DynamicArray to m_StaticArray.</span></div> +<div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>  T* <span class="keyword">const</span> dataPtr = data();</div> +<div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>  memmove(dataPtr + index, dataPtr + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>  }</div> +<div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>  resize(oldCount - 1);</div> +<div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>  }</div> +<div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>  </div> +<div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>  {</div> +<div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div> +<div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>  resize(newIndex + 1);</div> +<div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>  data()[newIndex] = src;</div> +<div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>  }</div> +<div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>  </div> +<div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>  <span class="keywordtype">void</span> pop_back()</div> +<div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>  {</div> +<div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>  resize(size() - 1);</div> +<div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>  }</div> +<div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>  </div> +<div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>  <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T& src)</div> +<div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>  {</div> +<div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>  insert(0, src);</div> +<div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>  }</div> +<div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>  </div> +<div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>  <span class="keywordtype">void</span> pop_front()</div> +<div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>  {</div> +<div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>  remove(0);</div> +<div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>  }</div> +<div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>  </div> +<div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>  <span class="keyword">typedef</span> T* iterator;</div> +<div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>  </div> +<div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>  iterator begin() { <span class="keywordflow">return</span> data(); }</div> +<div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>  iterator end() { <span class="keywordflow">return</span> data() + m_Count; }</div> +<div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>  </div> +<div class="line"><a name="l05450"></a><span class="lineno"> 5450</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>  <span class="keywordtype">size_t</span> m_Count;</div> +<div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>  T m_StaticArray[N]; <span class="comment">// Used when m_Size <= N</span></div> +<div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>  VmaVector<T, AllocatorT> m_DynamicArray; <span class="comment">// Used when m_Size > N</span></div> +<div class="line"><a name="l05454"></a><span class="lineno"> 5454</span> };</div> <div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>  </div> -<div class="line"><a name="l05456"></a><span class="lineno"> 5456</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05457"></a><span class="lineno"> 5457</span> <span class="keyword">typename</span> VmaPoolAllocator<T>::ItemBlock& VmaPoolAllocator<T>::CreateNewBlock()</div> -<div class="line"><a name="l05458"></a><span class="lineno"> 5458</span> {</div> -<div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>  <span class="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div> -<div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>  m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</div> -<div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>  </div> -<div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>  <span class="keyword">const</span> ItemBlock newBlock = {</div> -<div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>  vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div> -<div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>  newBlockCapacity,</div> -<div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>  0 };</div> -<div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>  </div> -<div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>  m_ItemBlocks.push_back(newBlock);</div> -<div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>  </div> -<div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>  <span class="comment">// Setup singly-linked list of all free items in this block.</span></div> -<div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < newBlockCapacity - 1; ++i)</div> -<div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>  newBlock.pItems[i].NextFreeIndex = i + 1;</div> -<div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>  newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div> -<div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>  <span class="keywordflow">return</span> m_ItemBlocks.back();</div> -<div class="line"><a name="l05474"></a><span class="lineno"> 5474</span> }</div> -<div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>  </div> -<div class="line"><a name="l05477"></a><span class="lineno"> 5477</span> <span class="comment">// class VmaRawList, VmaList</span></div> -<div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>  </div> -<div class="line"><a name="l05479"></a><span class="lineno"> 5479</span> <span class="preprocessor">#if VMA_USE_STL_LIST</span></div> +<div class="line"><a name="l05457"></a><span class="lineno"> 5457</span> <span class="comment">// class VmaPoolAllocator</span></div> +<div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>  </div> +<div class="line"><a name="l05459"></a><span class="lineno"> 5459</span> <span class="comment">/*</span></div> +<div class="line"><a name="l05460"></a><span class="lineno"> 5460</span> <span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div> +<div class="line"><a name="l05461"></a><span class="lineno"> 5461</span> <span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div> +<div class="line"><a name="l05462"></a><span class="lineno"> 5462</span> <span class="comment">allocator can create multiple blocks.</span></div> +<div class="line"><a name="l05463"></a><span class="lineno"> 5463</span> <span class="comment">*/</span></div> +<div class="line"><a name="l05464"></a><span class="lineno"> 5464</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05465"></a><span class="lineno"> 5465</span> <span class="keyword">class </span>VmaPoolAllocator</div> +<div class="line"><a name="l05466"></a><span class="lineno"> 5466</span> {</div> +<div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>  VMA_CLASS_NO_COPY(VmaPoolAllocator)</div> +<div class="line"><a name="l05468"></a><span class="lineno"> 5468</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>  VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity);</div> +<div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>  ~VmaPoolAllocator();</div> +<div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>  <span class="keyword">template</span><<span class="keyword">typename</span>... Types> T* Alloc(Types... args);</div> +<div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>  <span class="keywordtype">void</span> Free(T* ptr);</div> +<div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>  </div> +<div class="line"><a name="l05474"></a><span class="lineno"> 5474</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>  <span class="keyword">union </span>Item</div> +<div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>  {</div> +<div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>  uint32_t NextFreeIndex;</div> +<div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>  <span class="keyword">alignas</span>(T) <span class="keywordtype">char</span> Value[<span class="keyword">sizeof</span>(T)];</div> +<div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>  };</div> <div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>  </div> -<div class="line"><a name="l05481"></a><span class="lineno"> 5481</span> <span class="preprocessor">#define VmaList std::list</span></div> -<div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>  </div> -<div class="line"><a name="l05483"></a><span class="lineno"> 5483</span> <span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div> -<div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>  </div> -<div class="line"><a name="l05485"></a><span class="lineno"> 5485</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05486"></a><span class="lineno"> 5486</span> <span class="keyword">struct </span>VmaListItem</div> -<div class="line"><a name="l05487"></a><span class="lineno"> 5487</span> {</div> -<div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>  VmaListItem* pPrev;</div> -<div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>  VmaListItem* pNext;</div> -<div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>  T Value;</div> -<div class="line"><a name="l05491"></a><span class="lineno"> 5491</span> };</div> -<div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>  </div> -<div class="line"><a name="l05493"></a><span class="lineno"> 5493</span> <span class="comment">// Doubly linked list.</span></div> -<div class="line"><a name="l05494"></a><span class="lineno"> 5494</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05495"></a><span class="lineno"> 5495</span> <span class="keyword">class </span>VmaRawList</div> -<div class="line"><a name="l05496"></a><span class="lineno"> 5496</span> {</div> -<div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>  VMA_CLASS_NO_COPY(VmaRawList)</div> -<div class="line"><a name="l05498"></a><span class="lineno"> 5498</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>  <span class="keyword">typedef</span> VmaListItem<T> ItemType;</div> -<div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>  </div> -<div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>  VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div> -<div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>  ~VmaRawList();</div> -<div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>  <span class="keywordtype">void</span> Clear();</div> -<div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>  </div> -<div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>  <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> -<div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>  <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> -<div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>  </div> -<div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>  ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div> -<div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>  <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div> -<div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>  ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div> -<div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>  <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div> -<div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>  </div> -<div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>  ItemType* PushBack();</div> -<div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>  ItemType* PushFront();</div> -<div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>  ItemType* PushBack(<span class="keyword">const</span> T& value);</div> -<div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>  ItemType* PushFront(<span class="keyword">const</span> T& value);</div> -<div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>  <span class="keywordtype">void</span> PopBack();</div> -<div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>  <span class="keywordtype">void</span> PopFront();</div> -<div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>  </div> -<div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>  <span class="comment">// Item can be null - it means PushBack.</span></div> -<div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>  ItemType* InsertBefore(ItemType* pItem);</div> -<div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>  <span class="comment">// Item can be null - it means PushFront.</span></div> -<div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>  ItemType* InsertAfter(ItemType* pItem);</div> -<div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>  </div> -<div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>  ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T& value);</div> -<div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>  ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T& value);</div> -<div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>  </div> -<div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>  <span class="keywordtype">void</span> Remove(ItemType* pItem);</div> -<div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>  </div> -<div class="line"><a name="l05530"></a><span class="lineno"> 5530</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>  <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div> -<div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>  VmaPoolAllocator<ItemType> m_ItemAllocator;</div> -<div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>  ItemType* m_pFront;</div> -<div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>  ItemType* m_pBack;</div> -<div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>  <span class="keywordtype">size_t</span> m_Count;</div> -<div class="line"><a name="l05536"></a><span class="lineno"> 5536</span> };</div> +<div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>  <span class="keyword">struct </span>ItemBlock</div> +<div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>  {</div> +<div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>  Item* pItems;</div> +<div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>  uint32_t Capacity;</div> +<div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>  uint32_t FirstFreeIndex;</div> +<div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>  };</div> +<div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>  </div> +<div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>  <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div> +<div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>  <span class="keyword">const</span> uint32_t m_FirstBlockCapacity;</div> +<div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>  VmaVector< ItemBlock, VmaStlAllocator<ItemBlock> > m_ItemBlocks;</div> +<div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>  </div> +<div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>  ItemBlock& CreateNewBlock();</div> +<div class="line"><a name="l05493"></a><span class="lineno"> 5493</span> };</div> +<div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>  </div> +<div class="line"><a name="l05495"></a><span class="lineno"> 5495</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05496"></a><span class="lineno"> 5496</span> VmaPoolAllocator<T>::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, uint32_t firstBlockCapacity) :</div> +<div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>  m_pAllocationCallbacks(pAllocationCallbacks),</div> +<div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>  m_FirstBlockCapacity(firstBlockCapacity),</div> +<div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>  m_ItemBlocks(VmaStlAllocator<ItemBlock>(pAllocationCallbacks))</div> +<div class="line"><a name="l05500"></a><span class="lineno"> 5500</span> {</div> +<div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>  VMA_ASSERT(m_FirstBlockCapacity > 1);</div> +<div class="line"><a name="l05502"></a><span class="lineno"> 5502</span> }</div> +<div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>  </div> +<div class="line"><a name="l05504"></a><span class="lineno"> 5504</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05505"></a><span class="lineno"> 5505</span> VmaPoolAllocator<T>::~VmaPoolAllocator()</div> +<div class="line"><a name="l05506"></a><span class="lineno"> 5506</span> {</div> +<div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> +<div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>  vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemBlocks[i].Capacity);</div> +<div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>  m_ItemBlocks.clear();</div> +<div class="line"><a name="l05510"></a><span class="lineno"> 5510</span> }</div> +<div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>  </div> +<div class="line"><a name="l05512"></a><span class="lineno"> 5512</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05513"></a><span class="lineno"> 5513</span> <span class="keyword">template</span><<span class="keyword">typename</span>... Types> T* VmaPoolAllocator<T>::Alloc(Types... args)</div> +<div class="line"><a name="l05514"></a><span class="lineno"> 5514</span> {</div> +<div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> +<div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>  {</div> +<div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>  ItemBlock& block = m_ItemBlocks[i];</div> +<div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>  <span class="comment">// This block has some free items: Use first one.</span></div> +<div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>  <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div> +<div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>  {</div> +<div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>  Item* <span class="keyword">const</span> pItem = &block.pItems[block.FirstFreeIndex];</div> +<div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>  block.FirstFreeIndex = pItem->NextFreeIndex;</div> +<div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>  T* result = (T*)&pItem->Value;</div> +<div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>  <span class="keyword">new</span>(result)T(std::forward<Types>(args)...); <span class="comment">// Explicit constructor call.</span></div> +<div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>  }</div> +<div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>  }</div> +<div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>  </div> +<div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>  <span class="comment">// No block has free item: Create new one and use it.</span></div> +<div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>  ItemBlock& newBlock = CreateNewBlock();</div> +<div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>  Item* <span class="keyword">const</span> pItem = &newBlock.pItems[0];</div> +<div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>  newBlock.FirstFreeIndex = pItem->NextFreeIndex;</div> +<div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>  T* result = (T*)&pItem->Value;</div> +<div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>  <span class="keyword">new</span>(result)T(std::forward<Types>(args)...); <span class="comment">// Explicit constructor call.</span></div> +<div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l05536"></a><span class="lineno"> 5536</span> }</div> <div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>  </div> <div class="line"><a name="l05538"></a><span class="lineno"> 5538</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05539"></a><span class="lineno"> 5539</span> VmaRawList<T>::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div> -<div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>  m_pAllocationCallbacks(pAllocationCallbacks),</div> -<div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>  m_ItemAllocator(pAllocationCallbacks, 128),</div> -<div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>  m_pFront(VMA_NULL),</div> -<div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>  m_pBack(VMA_NULL),</div> -<div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>  m_Count(0)</div> -<div class="line"><a name="l05545"></a><span class="lineno"> 5545</span> {</div> -<div class="line"><a name="l05546"></a><span class="lineno"> 5546</span> }</div> -<div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>  </div> -<div class="line"><a name="l05548"></a><span class="lineno"> 5548</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05549"></a><span class="lineno"> 5549</span> VmaRawList<T>::~VmaRawList()</div> -<div class="line"><a name="l05550"></a><span class="lineno"> 5550</span> {</div> -<div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>  <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div> -<div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>  <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div> -<div class="line"><a name="l05553"></a><span class="lineno"> 5553</span> }</div> -<div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>  </div> -<div class="line"><a name="l05555"></a><span class="lineno"> 5555</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05556"></a><span class="lineno"> 5556</span> <span class="keywordtype">void</span> VmaRawList<T>::Clear()</div> -<div class="line"><a name="l05557"></a><span class="lineno"> 5557</span> {</div> -<div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>  <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div> -<div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>  {</div> -<div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>  ItemType* pItem = m_pBack;</div> -<div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>  <span class="keywordflow">while</span>(pItem != VMA_NULL)</div> -<div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>  {</div> -<div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>  ItemType* <span class="keyword">const</span> pPrevItem = pItem->pPrev;</div> -<div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>  m_ItemAllocator.Free(pItem);</div> -<div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>  pItem = pPrevItem;</div> -<div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>  }</div> -<div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>  m_pFront = VMA_NULL;</div> -<div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>  m_pBack = VMA_NULL;</div> -<div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>  m_Count = 0;</div> -<div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>  }</div> -<div class="line"><a name="l05571"></a><span class="lineno"> 5571</span> }</div> -<div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>  </div> -<div class="line"><a name="l05573"></a><span class="lineno"> 5573</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05574"></a><span class="lineno"> 5574</span> VmaListItem<T>* VmaRawList<T>::PushBack()</div> -<div class="line"><a name="l05575"></a><span class="lineno"> 5575</span> {</div> -<div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>  ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div> -<div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>  pNewItem->pNext = VMA_NULL;</div> -<div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>  <span class="keywordflow">if</span>(IsEmpty())</div> -<div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>  {</div> -<div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>  pNewItem->pPrev = VMA_NULL;</div> -<div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>  m_pFront = pNewItem;</div> -<div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>  m_pBack = pNewItem;</div> -<div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>  m_Count = 1;</div> -<div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>  }</div> -<div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>  {</div> -<div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>  pNewItem->pPrev = m_pBack;</div> -<div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>  m_pBack->pNext = pNewItem;</div> -<div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>  m_pBack = pNewItem;</div> -<div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>  ++m_Count;</div> -<div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>  }</div> -<div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>  <span class="keywordflow">return</span> pNewItem;</div> -<div class="line"><a name="l05593"></a><span class="lineno"> 5593</span> }</div> -<div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>  </div> -<div class="line"><a name="l05595"></a><span class="lineno"> 5595</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05596"></a><span class="lineno"> 5596</span> VmaListItem<T>* VmaRawList<T>::PushFront()</div> -<div class="line"><a name="l05597"></a><span class="lineno"> 5597</span> {</div> -<div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>  ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div> -<div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>  pNewItem->pPrev = VMA_NULL;</div> -<div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>  <span class="keywordflow">if</span>(IsEmpty())</div> -<div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>  {</div> -<div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>  pNewItem->pNext = VMA_NULL;</div> -<div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>  m_pFront = pNewItem;</div> -<div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>  m_pBack = pNewItem;</div> -<div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>  m_Count = 1;</div> -<div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>  }</div> -<div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>  {</div> -<div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>  pNewItem->pNext = m_pFront;</div> -<div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>  m_pFront->pPrev = pNewItem;</div> -<div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>  m_pFront = pNewItem;</div> -<div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>  ++m_Count;</div> -<div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>  }</div> -<div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>  <span class="keywordflow">return</span> pNewItem;</div> -<div class="line"><a name="l05615"></a><span class="lineno"> 5615</span> }</div> -<div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>  </div> -<div class="line"><a name="l05617"></a><span class="lineno"> 5617</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05618"></a><span class="lineno"> 5618</span> VmaListItem<T>* VmaRawList<T>::PushBack(<span class="keyword">const</span> T& value)</div> -<div class="line"><a name="l05619"></a><span class="lineno"> 5619</span> {</div> -<div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>  ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div> -<div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>  pNewItem->Value = value;</div> -<div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>  <span class="keywordflow">return</span> pNewItem;</div> -<div class="line"><a name="l05623"></a><span class="lineno"> 5623</span> }</div> -<div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>  </div> -<div class="line"><a name="l05625"></a><span class="lineno"> 5625</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05626"></a><span class="lineno"> 5626</span> VmaListItem<T>* VmaRawList<T>::PushFront(<span class="keyword">const</span> T& value)</div> -<div class="line"><a name="l05627"></a><span class="lineno"> 5627</span> {</div> -<div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>  ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div> -<div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>  pNewItem->Value = value;</div> -<div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>  <span class="keywordflow">return</span> pNewItem;</div> -<div class="line"><a name="l05631"></a><span class="lineno"> 5631</span> }</div> -<div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>  </div> -<div class="line"><a name="l05633"></a><span class="lineno"> 5633</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05634"></a><span class="lineno"> 5634</span> <span class="keywordtype">void</span> VmaRawList<T>::PopBack()</div> -<div class="line"><a name="l05635"></a><span class="lineno"> 5635</span> {</div> -<div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>  ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div> -<div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>  ItemType* <span class="keyword">const</span> pPrevItem = pBackItem->pPrev;</div> -<div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>  <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div> -<div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>  {</div> -<div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>  pPrevItem->pNext = VMA_NULL;</div> -<div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>  }</div> -<div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>  m_pBack = pPrevItem;</div> -<div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>  m_ItemAllocator.Free(pBackItem);</div> -<div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>  --m_Count;</div> -<div class="line"><a name="l05646"></a><span class="lineno"> 5646</span> }</div> -<div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>  </div> -<div class="line"><a name="l05648"></a><span class="lineno"> 5648</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05649"></a><span class="lineno"> 5649</span> <span class="keywordtype">void</span> VmaRawList<T>::PopFront()</div> -<div class="line"><a name="l05650"></a><span class="lineno"> 5650</span> {</div> -<div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>  ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div> -<div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>  ItemType* <span class="keyword">const</span> pNextItem = pFrontItem->pNext;</div> -<div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>  <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div> -<div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>  {</div> -<div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>  pNextItem->pPrev = VMA_NULL;</div> -<div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>  }</div> -<div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>  m_pFront = pNextItem;</div> -<div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>  m_ItemAllocator.Free(pFrontItem);</div> -<div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>  --m_Count;</div> -<div class="line"><a name="l05661"></a><span class="lineno"> 5661</span> }</div> -<div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>  </div> -<div class="line"><a name="l05663"></a><span class="lineno"> 5663</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05664"></a><span class="lineno"> 5664</span> <span class="keywordtype">void</span> VmaRawList<T>::Remove(ItemType* pItem)</div> -<div class="line"><a name="l05665"></a><span class="lineno"> 5665</span> {</div> -<div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>  VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div> -<div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> -<div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>  </div> -<div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>  <span class="keywordflow">if</span>(pItem->pPrev != VMA_NULL)</div> -<div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>  {</div> -<div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>  pItem->pPrev->pNext = pItem->pNext;</div> -<div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>  }</div> -<div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>  {</div> -<div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>  VMA_HEAVY_ASSERT(m_pFront == pItem);</div> -<div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>  m_pFront = pItem->pNext;</div> +<div class="line"><a name="l05539"></a><span class="lineno"> 5539</span> <span class="keywordtype">void</span> VmaPoolAllocator<T>::Free(T* ptr)</div> +<div class="line"><a name="l05540"></a><span class="lineno"> 5540</span> {</div> +<div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>  <span class="comment">// Search all memory blocks to find ptr.</span></div> +<div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div> +<div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>  {</div> +<div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>  ItemBlock& block = m_ItemBlocks[i];</div> +<div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>  </div> +<div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>  <span class="comment">// Casting to union.</span></div> +<div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>  Item* pItemPtr;</div> +<div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>  memcpy(&pItemPtr, &ptr, <span class="keyword">sizeof</span>(pItemPtr));</div> +<div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>  </div> +<div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>  <span class="comment">// Check if pItemPtr is in address range of this block.</span></div> +<div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>  <span class="keywordflow">if</span>((pItemPtr >= block.pItems) && (pItemPtr < block.pItems + block.Capacity))</div> +<div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>  {</div> +<div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>  ptr->~T(); <span class="comment">// Explicit destructor call.</span></div> +<div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>  <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast<</span>uint32_t<span class="keyword">></span>(pItemPtr - block.pItems);</div> +<div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>  pItemPtr->NextFreeIndex = block.FirstFreeIndex;</div> +<div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>  block.FirstFreeIndex = index;</div> +<div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>  }</div> +<div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>  }</div> +<div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>  VMA_ASSERT(0 && <span class="stringliteral">"Pointer doesn't belong to this memory pool."</span>);</div> +<div class="line"><a name="l05561"></a><span class="lineno"> 5561</span> }</div> +<div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>  </div> +<div class="line"><a name="l05563"></a><span class="lineno"> 5563</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05564"></a><span class="lineno"> 5564</span> <span class="keyword">typename</span> VmaPoolAllocator<T>::ItemBlock& VmaPoolAllocator<T>::CreateNewBlock()</div> +<div class="line"><a name="l05565"></a><span class="lineno"> 5565</span> {</div> +<div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>  <span class="keyword">const</span> uint32_t newBlockCapacity = m_ItemBlocks.empty() ?</div> +<div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>  m_FirstBlockCapacity : m_ItemBlocks.back().Capacity * 3 / 2;</div> +<div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>  </div> +<div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>  <span class="keyword">const</span> ItemBlock newBlock = {</div> +<div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>  vma_new_array(m_pAllocationCallbacks, Item, newBlockCapacity),</div> +<div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>  newBlockCapacity,</div> +<div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>  0 };</div> +<div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>  </div> +<div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>  m_ItemBlocks.push_back(newBlock);</div> +<div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>  </div> +<div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>  <span class="comment">// Setup singly-linked list of all free items in this block.</span></div> +<div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < newBlockCapacity - 1; ++i)</div> +<div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>  newBlock.pItems[i].NextFreeIndex = i + 1;</div> +<div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>  newBlock.pItems[newBlockCapacity - 1].NextFreeIndex = UINT32_MAX;</div> +<div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>  <span class="keywordflow">return</span> m_ItemBlocks.back();</div> +<div class="line"><a name="l05581"></a><span class="lineno"> 5581</span> }</div> +<div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>  </div> +<div class="line"><a name="l05584"></a><span class="lineno"> 5584</span> <span class="comment">// class VmaRawList, VmaList</span></div> +<div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>  </div> +<div class="line"><a name="l05586"></a><span class="lineno"> 5586</span> <span class="preprocessor">#if VMA_USE_STL_LIST</span></div> +<div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>  </div> +<div class="line"><a name="l05588"></a><span class="lineno"> 5588</span> <span class="preprocessor">#define VmaList std::list</span></div> +<div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>  </div> +<div class="line"><a name="l05590"></a><span class="lineno"> 5590</span> <span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_LIST</span></div> +<div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>  </div> +<div class="line"><a name="l05592"></a><span class="lineno"> 5592</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05593"></a><span class="lineno"> 5593</span> <span class="keyword">struct </span>VmaListItem</div> +<div class="line"><a name="l05594"></a><span class="lineno"> 5594</span> {</div> +<div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>  VmaListItem* pPrev;</div> +<div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>  VmaListItem* pNext;</div> +<div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>  T Value;</div> +<div class="line"><a name="l05598"></a><span class="lineno"> 5598</span> };</div> +<div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>  </div> +<div class="line"><a name="l05600"></a><span class="lineno"> 5600</span> <span class="comment">// Doubly linked list.</span></div> +<div class="line"><a name="l05601"></a><span class="lineno"> 5601</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05602"></a><span class="lineno"> 5602</span> <span class="keyword">class </span>VmaRawList</div> +<div class="line"><a name="l05603"></a><span class="lineno"> 5603</span> {</div> +<div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>  VMA_CLASS_NO_COPY(VmaRawList)</div> +<div class="line"><a name="l05605"></a><span class="lineno"> 5605</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>  <span class="keyword">typedef</span> VmaListItem<T> ItemType;</div> +<div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>  </div> +<div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>  VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div> +<div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>  ~VmaRawList();</div> +<div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>  <span class="keywordtype">void</span> Clear();</div> +<div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>  </div> +<div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>  <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> +<div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>  <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> +<div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>  </div> +<div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>  ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div> +<div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>  <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div> +<div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>  ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div> +<div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>  <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div> +<div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>  </div> +<div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>  ItemType* PushBack();</div> +<div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>  ItemType* PushFront();</div> +<div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>  ItemType* PushBack(<span class="keyword">const</span> T& value);</div> +<div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>  ItemType* PushFront(<span class="keyword">const</span> T& value);</div> +<div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>  <span class="keywordtype">void</span> PopBack();</div> +<div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>  <span class="keywordtype">void</span> PopFront();</div> +<div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>  </div> +<div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>  <span class="comment">// Item can be null - it means PushBack.</span></div> +<div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>  ItemType* InsertBefore(ItemType* pItem);</div> +<div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>  <span class="comment">// Item can be null - it means PushFront.</span></div> +<div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>  ItemType* InsertAfter(ItemType* pItem);</div> +<div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>  </div> +<div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>  ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T& value);</div> +<div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>  ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T& value);</div> +<div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>  </div> +<div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>  <span class="keywordtype">void</span> Remove(ItemType* pItem);</div> +<div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>  </div> +<div class="line"><a name="l05637"></a><span class="lineno"> 5637</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>  <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div> +<div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>  VmaPoolAllocator<ItemType> m_ItemAllocator;</div> +<div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>  ItemType* m_pFront;</div> +<div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>  ItemType* m_pBack;</div> +<div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>  <span class="keywordtype">size_t</span> m_Count;</div> +<div class="line"><a name="l05643"></a><span class="lineno"> 5643</span> };</div> +<div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>  </div> +<div class="line"><a name="l05645"></a><span class="lineno"> 5645</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05646"></a><span class="lineno"> 5646</span> VmaRawList<T>::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div> +<div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>  m_pAllocationCallbacks(pAllocationCallbacks),</div> +<div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>  m_ItemAllocator(pAllocationCallbacks, 128),</div> +<div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>  m_pFront(VMA_NULL),</div> +<div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>  m_pBack(VMA_NULL),</div> +<div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>  m_Count(0)</div> +<div class="line"><a name="l05652"></a><span class="lineno"> 5652</span> {</div> +<div class="line"><a name="l05653"></a><span class="lineno"> 5653</span> }</div> +<div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>  </div> +<div class="line"><a name="l05655"></a><span class="lineno"> 5655</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05656"></a><span class="lineno"> 5656</span> VmaRawList<T>::~VmaRawList()</div> +<div class="line"><a name="l05657"></a><span class="lineno"> 5657</span> {</div> +<div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>  <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div> +<div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>  <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div> +<div class="line"><a name="l05660"></a><span class="lineno"> 5660</span> }</div> +<div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>  </div> +<div class="line"><a name="l05662"></a><span class="lineno"> 5662</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05663"></a><span class="lineno"> 5663</span> <span class="keywordtype">void</span> VmaRawList<T>::Clear()</div> +<div class="line"><a name="l05664"></a><span class="lineno"> 5664</span> {</div> +<div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>  <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div> +<div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>  {</div> +<div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>  ItemType* pItem = m_pBack;</div> +<div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>  <span class="keywordflow">while</span>(pItem != VMA_NULL)</div> +<div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>  {</div> +<div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>  ItemType* <span class="keyword">const</span> pPrevItem = pItem->pPrev;</div> +<div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>  m_ItemAllocator.Free(pItem);</div> +<div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>  pItem = pPrevItem;</div> +<div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>  }</div> +<div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>  m_pFront = VMA_NULL;</div> +<div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>  m_pBack = VMA_NULL;</div> +<div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>  m_Count = 0;</div> <div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>  }</div> -<div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>  </div> -<div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>  <span class="keywordflow">if</span>(pItem->pNext != VMA_NULL)</div> -<div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>  {</div> -<div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>  pItem->pNext->pPrev = pItem->pPrev;</div> -<div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>  }</div> -<div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>  {</div> -<div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>  VMA_HEAVY_ASSERT(m_pBack == pItem);</div> -<div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>  m_pBack = pItem->pPrev;</div> -<div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>  }</div> -<div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>  </div> -<div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>  m_ItemAllocator.Free(pItem);</div> -<div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>  --m_Count;</div> -<div class="line"><a name="l05691"></a><span class="lineno"> 5691</span> }</div> -<div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>  </div> -<div class="line"><a name="l05693"></a><span class="lineno"> 5693</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05694"></a><span class="lineno"> 5694</span> VmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem)</div> -<div class="line"><a name="l05695"></a><span class="lineno"> 5695</span> {</div> -<div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>  <span class="keywordflow">if</span>(pItem != VMA_NULL)</div> -<div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>  {</div> -<div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>  ItemType* <span class="keyword">const</span> prevItem = pItem->pPrev;</div> -<div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>  ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div> -<div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>  newItem->pPrev = prevItem;</div> -<div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>  newItem->pNext = pItem;</div> -<div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>  pItem->pPrev = newItem;</div> -<div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>  <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div> -<div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>  {</div> -<div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>  prevItem->pNext = newItem;</div> -<div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>  }</div> -<div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>  {</div> -<div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>  VMA_HEAVY_ASSERT(m_pFront == pItem);</div> -<div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>  m_pFront = newItem;</div> -<div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>  }</div> -<div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>  ++m_Count;</div> -<div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>  <span class="keywordflow">return</span> newItem;</div> -<div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>  }</div> -<div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>  <span class="keywordflow">return</span> PushBack();</div> -<div class="line"><a name="l05717"></a><span class="lineno"> 5717</span> }</div> -<div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>  </div> -<div class="line"><a name="l05719"></a><span class="lineno"> 5719</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05720"></a><span class="lineno"> 5720</span> VmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem)</div> -<div class="line"><a name="l05721"></a><span class="lineno"> 5721</span> {</div> -<div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>  <span class="keywordflow">if</span>(pItem != VMA_NULL)</div> -<div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>  {</div> -<div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>  ItemType* <span class="keyword">const</span> nextItem = pItem->pNext;</div> -<div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>  ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div> -<div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>  newItem->pNext = nextItem;</div> -<div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>  newItem->pPrev = pItem;</div> -<div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>  pItem->pNext = newItem;</div> -<div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>  <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div> -<div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>  {</div> -<div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>  nextItem->pPrev = newItem;</div> -<div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>  }</div> -<div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>  {</div> -<div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>  VMA_HEAVY_ASSERT(m_pBack == pItem);</div> -<div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>  m_pBack = newItem;</div> -<div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>  }</div> -<div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>  ++m_Count;</div> -<div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>  <span class="keywordflow">return</span> newItem;</div> -<div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>  }</div> -<div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>  <span class="keywordflow">return</span> PushFront();</div> -<div class="line"><a name="l05743"></a><span class="lineno"> 5743</span> }</div> -<div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>  </div> -<div class="line"><a name="l05745"></a><span class="lineno"> 5745</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05746"></a><span class="lineno"> 5746</span> VmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T& value)</div> -<div class="line"><a name="l05747"></a><span class="lineno"> 5747</span> {</div> -<div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>  ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div> -<div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>  newItem->Value = value;</div> -<div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>  <span class="keywordflow">return</span> newItem;</div> -<div class="line"><a name="l05751"></a><span class="lineno"> 5751</span> }</div> -<div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>  </div> -<div class="line"><a name="l05753"></a><span class="lineno"> 5753</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l05754"></a><span class="lineno"> 5754</span> VmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T& value)</div> -<div class="line"><a name="l05755"></a><span class="lineno"> 5755</span> {</div> -<div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>  ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div> -<div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>  newItem->Value = value;</div> -<div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>  <span class="keywordflow">return</span> newItem;</div> -<div class="line"><a name="l05759"></a><span class="lineno"> 5759</span> }</div> -<div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>  </div> -<div class="line"><a name="l05761"></a><span class="lineno"> 5761</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT></div> -<div class="line"><a name="l05762"></a><span class="lineno"> 5762</span> <span class="keyword">class </span>VmaList</div> -<div class="line"><a name="l05763"></a><span class="lineno"> 5763</span> {</div> -<div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>  VMA_CLASS_NO_COPY(VmaList)</div> -<div class="line"><a name="l05765"></a><span class="lineno"> 5765</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>  <span class="keyword">class </span>iterator</div> -<div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>  {</div> -<div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>  iterator() :</div> -<div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>  m_pList(VMA_NULL),</div> -<div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>  m_pItem(VMA_NULL)</div> -<div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>  {</div> -<div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>  }</div> -<div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>  </div> -<div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>  T& operator*()<span class="keyword"> const</span></div> -<div class="line"><a name="l05776"></a><span class="lineno"> 5776</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>  <span class="keywordflow">return</span> m_pItem->Value;</div> -<div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>  }</div> -<div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>  T* operator->()<span class="keyword"> const</span></div> -<div class="line"><a name="l05781"></a><span class="lineno"> 5781</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>  <span class="keywordflow">return</span> &m_pItem->Value;</div> -<div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>  }</div> +<div class="line"><a name="l05678"></a><span class="lineno"> 5678</span> }</div> +<div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>  </div> +<div class="line"><a name="l05680"></a><span class="lineno"> 5680</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05681"></a><span class="lineno"> 5681</span> VmaListItem<T>* VmaRawList<T>::PushBack()</div> +<div class="line"><a name="l05682"></a><span class="lineno"> 5682</span> {</div> +<div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>  ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div> +<div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>  pNewItem->pNext = VMA_NULL;</div> +<div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>  {</div> +<div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>  pNewItem->pPrev = VMA_NULL;</div> +<div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>  m_pFront = pNewItem;</div> +<div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>  m_pBack = pNewItem;</div> +<div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>  m_Count = 1;</div> +<div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>  }</div> +<div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>  {</div> +<div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>  pNewItem->pPrev = m_pBack;</div> +<div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>  m_pBack->pNext = pNewItem;</div> +<div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>  m_pBack = pNewItem;</div> +<div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>  ++m_Count;</div> +<div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>  }</div> +<div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>  <span class="keywordflow">return</span> pNewItem;</div> +<div class="line"><a name="l05700"></a><span class="lineno"> 5700</span> }</div> +<div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>  </div> +<div class="line"><a name="l05702"></a><span class="lineno"> 5702</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05703"></a><span class="lineno"> 5703</span> VmaListItem<T>* VmaRawList<T>::PushFront()</div> +<div class="line"><a name="l05704"></a><span class="lineno"> 5704</span> {</div> +<div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>  ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div> +<div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>  pNewItem->pPrev = VMA_NULL;</div> +<div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>  {</div> +<div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>  pNewItem->pNext = VMA_NULL;</div> +<div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>  m_pFront = pNewItem;</div> +<div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>  m_pBack = pNewItem;</div> +<div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>  m_Count = 1;</div> +<div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>  }</div> +<div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>  {</div> +<div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>  pNewItem->pNext = m_pFront;</div> +<div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>  m_pFront->pPrev = pNewItem;</div> +<div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>  m_pFront = pNewItem;</div> +<div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>  ++m_Count;</div> +<div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>  }</div> +<div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>  <span class="keywordflow">return</span> pNewItem;</div> +<div class="line"><a name="l05722"></a><span class="lineno"> 5722</span> }</div> +<div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>  </div> +<div class="line"><a name="l05724"></a><span class="lineno"> 5724</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05725"></a><span class="lineno"> 5725</span> VmaListItem<T>* VmaRawList<T>::PushBack(<span class="keyword">const</span> T& value)</div> +<div class="line"><a name="l05726"></a><span class="lineno"> 5726</span> {</div> +<div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>  ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div> +<div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>  pNewItem->Value = value;</div> +<div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>  <span class="keywordflow">return</span> pNewItem;</div> +<div class="line"><a name="l05730"></a><span class="lineno"> 5730</span> }</div> +<div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>  </div> +<div class="line"><a name="l05732"></a><span class="lineno"> 5732</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05733"></a><span class="lineno"> 5733</span> VmaListItem<T>* VmaRawList<T>::PushFront(<span class="keyword">const</span> T& value)</div> +<div class="line"><a name="l05734"></a><span class="lineno"> 5734</span> {</div> +<div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>  ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div> +<div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>  pNewItem->Value = value;</div> +<div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>  <span class="keywordflow">return</span> pNewItem;</div> +<div class="line"><a name="l05738"></a><span class="lineno"> 5738</span> }</div> +<div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>  </div> +<div class="line"><a name="l05740"></a><span class="lineno"> 5740</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05741"></a><span class="lineno"> 5741</span> <span class="keywordtype">void</span> VmaRawList<T>::PopBack()</div> +<div class="line"><a name="l05742"></a><span class="lineno"> 5742</span> {</div> +<div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>  ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div> +<div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>  ItemType* <span class="keyword">const</span> pPrevItem = pBackItem->pPrev;</div> +<div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>  <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div> +<div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>  {</div> +<div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>  pPrevItem->pNext = VMA_NULL;</div> +<div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>  }</div> +<div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>  m_pBack = pPrevItem;</div> +<div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>  m_ItemAllocator.Free(pBackItem);</div> +<div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>  --m_Count;</div> +<div class="line"><a name="l05753"></a><span class="lineno"> 5753</span> }</div> +<div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>  </div> +<div class="line"><a name="l05755"></a><span class="lineno"> 5755</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05756"></a><span class="lineno"> 5756</span> <span class="keywordtype">void</span> VmaRawList<T>::PopFront()</div> +<div class="line"><a name="l05757"></a><span class="lineno"> 5757</span> {</div> +<div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>  ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div> +<div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>  ItemType* <span class="keyword">const</span> pNextItem = pFrontItem->pNext;</div> +<div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>  <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div> +<div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>  {</div> +<div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>  pNextItem->pPrev = VMA_NULL;</div> +<div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>  }</div> +<div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>  m_pFront = pNextItem;</div> +<div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>  m_ItemAllocator.Free(pFrontItem);</div> +<div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>  --m_Count;</div> +<div class="line"><a name="l05768"></a><span class="lineno"> 5768</span> }</div> +<div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>  </div> +<div class="line"><a name="l05770"></a><span class="lineno"> 5770</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05771"></a><span class="lineno"> 5771</span> <span class="keywordtype">void</span> VmaRawList<T>::Remove(ItemType* pItem)</div> +<div class="line"><a name="l05772"></a><span class="lineno"> 5772</span> {</div> +<div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>  VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div> +<div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>  </div> +<div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>  <span class="keywordflow">if</span>(pItem->pPrev != VMA_NULL)</div> +<div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>  {</div> +<div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>  pItem->pPrev->pNext = pItem->pNext;</div> +<div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>  }</div> +<div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>  {</div> +<div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>  VMA_HEAVY_ASSERT(m_pFront == pItem);</div> +<div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>  m_pFront = pItem->pNext;</div> +<div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>  }</div> <div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>  </div> -<div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>  iterator& operator++()</div> -<div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>  {</div> -<div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>  m_pItem = m_pItem->pNext;</div> -<div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>  }</div> -<div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>  iterator& operator--()</div> -<div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>  {</div> -<div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>  <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div> -<div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>  {</div> -<div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>  m_pItem = m_pItem->pPrev;</div> -<div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>  }</div> -<div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>  {</div> -<div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>  VMA_HEAVY_ASSERT(!m_pList->IsEmpty());</div> -<div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>  m_pItem = m_pList->Back();</div> -<div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>  }</div> -<div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>  }</div> -<div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>  </div> -<div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>  iterator operator++(<span class="keywordtype">int</span>)</div> -<div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>  {</div> -<div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>  iterator result = *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>  ++*<span class="keyword">this</span>;</div> -<div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>  }</div> -<div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>  iterator operator--(<span class="keywordtype">int</span>)</div> -<div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>  {</div> -<div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>  iterator result = *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>  --*<span class="keyword">this</span>;</div> -<div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>  }</div> -<div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>  </div> -<div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l05820"></a><span class="lineno"> 5820</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> -<div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>  <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div> -<div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>  }</div> -<div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l05825"></a><span class="lineno"> 5825</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> -<div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>  <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div> -<div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>  }</div> -<div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>  </div> -<div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>  VmaRawList<T>* m_pList;</div> -<div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>  VmaListItem<T>* m_pItem;</div> -<div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>  </div> -<div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>  iterator(VmaRawList<T>* pList, VmaListItem<T>* pItem) :</div> -<div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>  m_pList(pList),</div> -<div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>  m_pItem(pItem)</div> +<div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>  <span class="keywordflow">if</span>(pItem->pNext != VMA_NULL)</div> +<div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>  {</div> +<div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>  pItem->pNext->pPrev = pItem->pPrev;</div> +<div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>  }</div> +<div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>  {</div> +<div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>  VMA_HEAVY_ASSERT(m_pBack == pItem);</div> +<div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>  m_pBack = pItem->pPrev;</div> +<div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>  }</div> +<div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>  </div> +<div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>  m_ItemAllocator.Free(pItem);</div> +<div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>  --m_Count;</div> +<div class="line"><a name="l05798"></a><span class="lineno"> 5798</span> }</div> +<div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>  </div> +<div class="line"><a name="l05800"></a><span class="lineno"> 5800</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05801"></a><span class="lineno"> 5801</span> VmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem)</div> +<div class="line"><a name="l05802"></a><span class="lineno"> 5802</span> {</div> +<div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>  <span class="keywordflow">if</span>(pItem != VMA_NULL)</div> +<div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>  {</div> +<div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>  ItemType* <span class="keyword">const</span> prevItem = pItem->pPrev;</div> +<div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>  ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div> +<div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>  newItem->pPrev = prevItem;</div> +<div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>  newItem->pNext = pItem;</div> +<div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>  pItem->pPrev = newItem;</div> +<div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>  <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div> +<div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>  {</div> +<div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>  prevItem->pNext = newItem;</div> +<div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>  }</div> +<div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>  {</div> +<div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>  VMA_HEAVY_ASSERT(m_pFront == pItem);</div> +<div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>  m_pFront = newItem;</div> +<div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>  }</div> +<div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>  ++m_Count;</div> +<div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>  <span class="keywordflow">return</span> newItem;</div> +<div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>  }</div> +<div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>  <span class="keywordflow">return</span> PushBack();</div> +<div class="line"><a name="l05824"></a><span class="lineno"> 5824</span> }</div> +<div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>  </div> +<div class="line"><a name="l05826"></a><span class="lineno"> 5826</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05827"></a><span class="lineno"> 5827</span> VmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem)</div> +<div class="line"><a name="l05828"></a><span class="lineno"> 5828</span> {</div> +<div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>  <span class="keywordflow">if</span>(pItem != VMA_NULL)</div> +<div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>  {</div> +<div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>  ItemType* <span class="keyword">const</span> nextItem = pItem->pNext;</div> +<div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>  ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div> +<div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>  newItem->pNext = nextItem;</div> +<div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>  newItem->pPrev = pItem;</div> +<div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>  pItem->pNext = newItem;</div> +<div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>  <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div> <div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>  {</div> -<div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>  }</div> -<div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>  </div> -<div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaList<T, AllocatorT>;</div> -<div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>  };</div> -<div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>  </div> -<div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>  <span class="keyword">class </span>const_iterator</div> -<div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>  {</div> -<div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>  const_iterator() :</div> -<div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>  m_pList(VMA_NULL),</div> -<div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>  m_pItem(VMA_NULL)</div> -<div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>  {</div> -<div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>  }</div> +<div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>  nextItem->pPrev = newItem;</div> +<div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>  }</div> +<div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>  {</div> +<div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>  VMA_HEAVY_ASSERT(m_pBack == pItem);</div> +<div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>  m_pBack = newItem;</div> +<div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>  }</div> +<div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>  ++m_Count;</div> +<div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>  <span class="keywordflow">return</span> newItem;</div> +<div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>  }</div> +<div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>  <span class="keywordflow">return</span> PushFront();</div> +<div class="line"><a name="l05850"></a><span class="lineno"> 5850</span> }</div> <div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>  </div> -<div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>  const_iterator(<span class="keyword">const</span> iterator& src) :</div> -<div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>  m_pList(src.m_pList),</div> -<div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>  m_pItem(src.m_pItem)</div> -<div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>  {</div> -<div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>  }</div> -<div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>  </div> -<div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>  <span class="keyword">const</span> T& operator*()<span class="keyword"> const</span></div> -<div class="line"><a name="l05859"></a><span class="lineno"> 5859</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>  <span class="keywordflow">return</span> m_pItem->Value;</div> -<div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>  }</div> -<div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>  <span class="keyword">const</span> T* operator->()<span class="keyword"> const</span></div> -<div class="line"><a name="l05864"></a><span class="lineno"> 5864</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>  <span class="keywordflow">return</span> &m_pItem->Value;</div> -<div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>  }</div> -<div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>  </div> -<div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>  const_iterator& operator++()</div> -<div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>  {</div> -<div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> -<div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>  m_pItem = m_pItem->pNext;</div> -<div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>  }</div> -<div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>  const_iterator& operator--()</div> -<div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>  {</div> -<div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>  <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div> -<div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>  {</div> -<div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>  m_pItem = m_pItem->pPrev;</div> -<div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>  }</div> -<div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>  {</div> -<div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>  VMA_HEAVY_ASSERT(!m_pList->IsEmpty());</div> -<div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>  m_pItem = m_pList->Back();</div> -<div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>  }</div> -<div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>  }</div> -<div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>  </div> -<div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>  const_iterator operator++(<span class="keywordtype">int</span>)</div> -<div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>  {</div> -<div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>  const_iterator result = *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>  ++*<span class="keyword">this</span>;</div> -<div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>  }</div> -<div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>  const_iterator operator--(<span class="keywordtype">int</span>)</div> -<div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>  {</div> -<div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>  const_iterator result = *<span class="keyword">this</span>;</div> -<div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>  --*<span class="keyword">this</span>;</div> -<div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>  }</div> -<div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>  </div> -<div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l05903"></a><span class="lineno"> 5903</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> -<div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>  <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div> -<div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>  }</div> -<div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l05908"></a><span class="lineno"> 5908</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> -<div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>  <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div> +<div class="line"><a name="l05852"></a><span class="lineno"> 5852</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05853"></a><span class="lineno"> 5853</span> VmaListItem<T>* VmaRawList<T>::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T& value)</div> +<div class="line"><a name="l05854"></a><span class="lineno"> 5854</span> {</div> +<div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>  ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div> +<div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>  newItem->Value = value;</div> +<div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>  <span class="keywordflow">return</span> newItem;</div> +<div class="line"><a name="l05858"></a><span class="lineno"> 5858</span> }</div> +<div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>  </div> +<div class="line"><a name="l05860"></a><span class="lineno"> 5860</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l05861"></a><span class="lineno"> 5861</span> VmaListItem<T>* VmaRawList<T>::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T& value)</div> +<div class="line"><a name="l05862"></a><span class="lineno"> 5862</span> {</div> +<div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>  ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div> +<div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>  newItem->Value = value;</div> +<div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>  <span class="keywordflow">return</span> newItem;</div> +<div class="line"><a name="l05866"></a><span class="lineno"> 5866</span> }</div> +<div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>  </div> +<div class="line"><a name="l05868"></a><span class="lineno"> 5868</span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT></div> +<div class="line"><a name="l05869"></a><span class="lineno"> 5869</span> <span class="keyword">class </span>VmaList</div> +<div class="line"><a name="l05870"></a><span class="lineno"> 5870</span> {</div> +<div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>  VMA_CLASS_NO_COPY(VmaList)</div> +<div class="line"><a name="l05872"></a><span class="lineno"> 5872</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>  <span class="keyword">class </span>iterator</div> +<div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>  {</div> +<div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>  iterator() :</div> +<div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>  m_pList(VMA_NULL),</div> +<div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>  m_pItem(VMA_NULL)</div> +<div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>  {</div> +<div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>  }</div> +<div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>  </div> +<div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>  T& operator*()<span class="keyword"> const</span></div> +<div class="line"><a name="l05883"></a><span class="lineno"> 5883</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>  <span class="keywordflow">return</span> m_pItem->Value;</div> +<div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>  }</div> +<div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>  T* operator->()<span class="keyword"> const</span></div> +<div class="line"><a name="l05888"></a><span class="lineno"> 5888</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>  <span class="keywordflow">return</span> &m_pItem->Value;</div> +<div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>  }</div> +<div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>  </div> +<div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>  iterator& operator++()</div> +<div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>  {</div> +<div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>  m_pItem = m_pItem->pNext;</div> +<div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>  }</div> +<div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>  iterator& operator--()</div> +<div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>  {</div> +<div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>  <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div> +<div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>  {</div> +<div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>  m_pItem = m_pItem->pPrev;</div> +<div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>  }</div> +<div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>  {</div> +<div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>  VMA_HEAVY_ASSERT(!m_pList->IsEmpty());</div> +<div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>  m_pItem = m_pList->Back();</div> +<div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>  }</div> +<div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> <div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>  }</div> -<div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>  </div> -<div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>  const_iterator(<span class="keyword">const</span> VmaRawList<T>* pList, <span class="keyword">const</span> VmaListItem<T>* pItem) :</div> -<div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>  m_pList(pList),</div> -<div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>  m_pItem(pItem)</div> -<div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>  {</div> +<div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>  </div> +<div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>  iterator operator++(<span class="keywordtype">int</span>)</div> +<div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>  {</div> +<div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>  iterator result = *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>  ++*<span class="keyword">this</span>;</div> +<div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>  <span class="keywordflow">return</span> result;</div> <div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>  }</div> -<div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>  </div> -<div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>  <span class="keyword">const</span> VmaRawList<T>* m_pList;</div> -<div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>  <span class="keyword">const</span> VmaListItem<T>* m_pItem;</div> -<div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>  </div> -<div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaList<T, AllocatorT>;</div> -<div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>  };</div> +<div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>  iterator operator--(<span class="keywordtype">int</span>)</div> +<div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>  {</div> +<div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>  iterator result = *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>  --*<span class="keyword">this</span>;</div> +<div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>  }</div> <div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>  </div> -<div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>  VmaList(<span class="keyword">const</span> AllocatorT& allocator) : m_RawList(allocator.m_pCallbacks) { }</div> -<div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>  </div> -<div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div> -<div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div> -<div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>  </div> -<div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>  iterator begin() { <span class="keywordflow">return</span> iterator(&m_RawList, m_RawList.Front()); }</div> -<div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>  iterator end() { <span class="keywordflow">return</span> iterator(&m_RawList, VMA_NULL); }</div> -<div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>  </div> -<div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>  const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&m_RawList, m_RawList.Front()); }</div> -<div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>  const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&m_RawList, VMA_NULL); }</div> +<div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l05927"></a><span class="lineno"> 5927</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> +<div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>  <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div> +<div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>  }</div> +<div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l05932"></a><span class="lineno"> 5932</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> +<div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>  <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div> +<div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>  }</div> <div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>  </div> -<div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>  <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div> -<div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& value) { m_RawList.PushBack(value); }</div> -<div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>  <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div> -<div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>  iterator insert(iterator it, <span class="keyword">const</span> T& value) { <span class="keywordflow">return</span> iterator(&m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div> -<div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>  </div> -<div class="line"><a name="l05942"></a><span class="lineno"> 5942</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>  VmaRawList<T> m_RawList;</div> -<div class="line"><a name="l05944"></a><span class="lineno"> 5944</span> };</div> -<div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>  </div> -<div class="line"><a name="l05946"></a><span class="lineno"> 5946</span> <span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div> -<div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>  </div> -<div class="line"><a name="l05949"></a><span class="lineno"> 5949</span> <span class="comment">// class VmaMap</span></div> -<div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>  </div> -<div class="line"><a name="l05951"></a><span class="lineno"> 5951</span> <span class="comment">// Unused in this version.</span></div> -<div class="line"><a name="l05952"></a><span class="lineno"> 5952</span> <span class="preprocessor">#if 0</span></div> -<div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>  </div> -<div class="line"><a name="l05954"></a><span class="lineno"> 5954</span> <span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div> -<div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>  </div> -<div class="line"><a name="l05956"></a><span class="lineno"> 5956</span> <span class="preprocessor">#define VmaPair std::pair</span></div> -<div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>  </div> -<div class="line"><a name="l05958"></a><span class="lineno"> 5958</span> <span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div> -<div class="line"><a name="l05959"></a><span class="lineno"> 5959</span> <span class="preprocessor"> std::unordered_map< KeyT, ValueT, std::hash<KeyT>, std::equal_to<KeyT>, VmaStlAllocator< std::pair<KeyT, ValueT> > ></span></div> -<div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>  </div> -<div class="line"><a name="l05961"></a><span class="lineno"> 5961</span> <span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div> -<div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>  </div> -<div class="line"><a name="l05963"></a><span class="lineno"> 5963</span> <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div> -<div class="line"><a name="l05964"></a><span class="lineno"> 5964</span> <span class="keyword">struct </span>VmaPair</div> -<div class="line"><a name="l05965"></a><span class="lineno"> 5965</span> {</div> -<div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>  T1 first;</div> -<div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>  T2 second;</div> -<div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>  </div> -<div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>  VmaPair() : first(), second() { }</div> -<div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>  VmaPair(<span class="keyword">const</span> T1& firstSrc, <span class="keyword">const</span> T2& secondSrc) : first(firstSrc), second(secondSrc) { }</div> -<div class="line"><a name="l05971"></a><span class="lineno"> 5971</span> };</div> -<div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>  </div> -<div class="line"><a name="l05973"></a><span class="lineno"> 5973</span> <span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div> -<div class="line"><a name="l05974"></a><span class="lineno"> 5974</span> <span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div> -<div class="line"><a name="l05975"></a><span class="lineno"> 5975</span> <span class="comment">*/</span></div> -<div class="line"><a name="l05976"></a><span class="lineno"> 5976</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> -<div class="line"><a name="l05977"></a><span class="lineno"> 5977</span> <span class="keyword">class </span>VmaMap</div> -<div class="line"><a name="l05978"></a><span class="lineno"> 5978</span> {</div> -<div class="line"><a name="l05979"></a><span class="lineno"> 5979</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>  <span class="keyword">typedef</span> VmaPair<KeyT, ValueT> PairType;</div> -<div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>  <span class="keyword">typedef</span> PairType* iterator;</div> -<div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>  </div> -<div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>  VmaMap(<span class="keyword">const</span> VmaStlAllocator<PairType>& allocator) : m_Vector(allocator) { }</div> -<div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>  </div> -<div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>  iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div> -<div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>  iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div> -<div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>  </div> -<div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>  <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType& pair);</div> -<div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>  iterator find(<span class="keyword">const</span> KeyT& key);</div> -<div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>  <span class="keywordtype">void</span> erase(iterator it);</div> -<div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>  </div> -<div class="line"><a name="l05992"></a><span class="lineno"> 5992</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>  VmaVector< PairType, VmaStlAllocator<PairType> > m_Vector;</div> -<div class="line"><a name="l05994"></a><span class="lineno"> 5994</span> };</div> +<div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>  VmaRawList<T>* m_pList;</div> +<div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>  VmaListItem<T>* m_pItem;</div> +<div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>  </div> +<div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>  iterator(VmaRawList<T>* pList, VmaListItem<T>* pItem) :</div> +<div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>  m_pList(pList),</div> +<div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>  m_pItem(pItem)</div> +<div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>  {</div> +<div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>  }</div> +<div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>  </div> +<div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaList<T, AllocatorT>;</div> +<div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>  };</div> +<div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>  </div> +<div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>  <span class="keyword">class </span>const_iterator</div> +<div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>  {</div> +<div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>  const_iterator() :</div> +<div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>  m_pList(VMA_NULL),</div> +<div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>  m_pItem(VMA_NULL)</div> +<div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>  {</div> +<div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>  }</div> +<div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>  </div> +<div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>  const_iterator(<span class="keyword">const</span> iterator& src) :</div> +<div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>  m_pList(src.m_pList),</div> +<div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>  m_pItem(src.m_pItem)</div> +<div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>  {</div> +<div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>  }</div> +<div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>  </div> +<div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>  <span class="keyword">const</span> T& operator*()<span class="keyword"> const</span></div> +<div class="line"><a name="l05966"></a><span class="lineno"> 5966</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>  <span class="keywordflow">return</span> m_pItem->Value;</div> +<div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>  }</div> +<div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>  <span class="keyword">const</span> T* operator->()<span class="keyword"> const</span></div> +<div class="line"><a name="l05971"></a><span class="lineno"> 5971</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>  <span class="keywordflow">return</span> &m_pItem->Value;</div> +<div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>  }</div> +<div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>  </div> +<div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>  const_iterator& operator++()</div> +<div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>  {</div> +<div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>  VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div> +<div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>  m_pItem = m_pItem->pNext;</div> +<div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>  }</div> +<div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>  const_iterator& operator--()</div> +<div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>  {</div> +<div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>  <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div> +<div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>  {</div> +<div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>  m_pItem = m_pItem->pPrev;</div> +<div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>  }</div> +<div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>  {</div> +<div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>  VMA_HEAVY_ASSERT(!m_pList->IsEmpty());</div> +<div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>  m_pItem = m_pList->Back();</div> +<div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>  }</div> +<div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>  }</div> <div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>  </div> -<div class="line"><a name="l05996"></a><span class="lineno"> 5996</span> <span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap<KeyT, ValueT></span></div> -<div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>  </div> -<div class="line"><a name="l05998"></a><span class="lineno"> 5998</span> <span class="keyword">template</span><<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT></div> -<div class="line"><a name="l05999"></a><span class="lineno"> 5999</span> <span class="keyword">struct </span>VmaPairFirstLess</div> -<div class="line"><a name="l06000"></a><span class="lineno"> 6000</span> {</div> -<div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair<FirstT, SecondT>& lhs, <span class="keyword">const</span> VmaPair<FirstT, SecondT>& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l06002"></a><span class="lineno"> 6002</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>  <span class="keywordflow">return</span> lhs.first < rhs.first;</div> -<div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>  }</div> -<div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair<FirstT, SecondT>& lhs, <span class="keyword">const</span> FirstT& rhsFirst)<span class="keyword"> const</span></div> -<div class="line"><a name="l06006"></a><span class="lineno"> 6006</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>  <span class="keywordflow">return</span> lhs.first < rhsFirst;</div> -<div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>  }</div> -<div class="line"><a name="l06009"></a><span class="lineno"> 6009</span> };</div> -<div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>  </div> -<div class="line"><a name="l06011"></a><span class="lineno"> 6011</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> -<div class="line"><a name="l06012"></a><span class="lineno"> 6012</span> <span class="keywordtype">void</span> VmaMap<KeyT, ValueT>::insert(<span class="keyword">const</span> PairType& pair)</div> -<div class="line"><a name="l06013"></a><span class="lineno"> 6013</span> {</div> -<div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>  m_Vector.data(),</div> -<div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>  m_Vector.data() + m_Vector.size(),</div> -<div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>  pair,</div> -<div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>  VmaPairFirstLess<KeyT, ValueT>()) - m_Vector.data();</div> -<div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>  VmaVectorInsert(m_Vector, indexToInsert, pair);</div> -<div class="line"><a name="l06020"></a><span class="lineno"> 6020</span> }</div> -<div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>  </div> -<div class="line"><a name="l06022"></a><span class="lineno"> 6022</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> -<div class="line"><a name="l06023"></a><span class="lineno"> 6023</span> VmaPair<KeyT, ValueT>* VmaMap<KeyT, ValueT>::find(<span class="keyword">const</span> KeyT& key)</div> -<div class="line"><a name="l06024"></a><span class="lineno"> 6024</span> {</div> -<div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>  PairType* it = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>  m_Vector.data(),</div> -<div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>  m_Vector.data() + m_Vector.size(),</div> -<div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>  key,</div> -<div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>  VmaPairFirstLess<KeyT, ValueT>());</div> -<div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>  <span class="keywordflow">if</span>((it != m_Vector.end()) && (it->first == key))</div> -<div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>  {</div> -<div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>  <span class="keywordflow">return</span> it;</div> -<div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>  }</div> -<div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>  {</div> -<div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>  <span class="keywordflow">return</span> m_Vector.end();</div> -<div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>  }</div> -<div class="line"><a name="l06038"></a><span class="lineno"> 6038</span> }</div> -<div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>  </div> -<div class="line"><a name="l06040"></a><span class="lineno"> 6040</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> -<div class="line"><a name="l06041"></a><span class="lineno"> 6041</span> <span class="keywordtype">void</span> VmaMap<KeyT, ValueT>::erase(iterator it)</div> -<div class="line"><a name="l06042"></a><span class="lineno"> 6042</span> {</div> -<div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>  VmaVectorRemove(m_Vector, it - m_Vector.begin());</div> -<div class="line"><a name="l06044"></a><span class="lineno"> 6044</span> }</div> -<div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>  </div> -<div class="line"><a name="l06046"></a><span class="lineno"> 6046</span> <span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div> -<div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>  </div> -<div class="line"><a name="l06048"></a><span class="lineno"> 6048</span> <span class="preprocessor">#endif // #if 0</span></div> -<div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>  </div> -<div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>  </div> -<div class="line"><a name="l06052"></a><span class="lineno"> 6052</span> <span class="keyword">class </span>VmaDeviceMemoryBlock;</div> -<div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>  </div> -<div class="line"><a name="l06054"></a><span class="lineno"> 6054</span> <span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div> -<div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>  </div> -<div class="line"><a name="l06056"></a><span class="lineno"> 6056</span> <span class="keyword">struct </span>VmaAllocation_T</div> -<div class="line"><a name="l06057"></a><span class="lineno"> 6057</span> {</div> -<div class="line"><a name="l06058"></a><span class="lineno"> 6058</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>  <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div> -<div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>  </div> -<div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>  <span class="keyword">enum</span> FLAGS</div> -<div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>  {</div> -<div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>  FLAG_USER_DATA_STRING = 0x01,</div> -<div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>  };</div> -<div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>  </div> -<div class="line"><a name="l06066"></a><span class="lineno"> 6066</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>  <span class="keyword">enum</span> ALLOCATION_TYPE</div> -<div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>  {</div> -<div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>  ALLOCATION_TYPE_NONE,</div> -<div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>  ALLOCATION_TYPE_BLOCK,</div> -<div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>  ALLOCATION_TYPE_DEDICATED,</div> -<div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>  };</div> -<div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>  </div> -<div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06075"></a><span class="lineno"> 6075</span> <span class="comment"> This struct is allocated using VmaPoolAllocator.</span></div> -<div class="line"><a name="l06076"></a><span class="lineno"> 6076</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>  </div> -<div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>  VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div> -<div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>  m_Alignment{1},</div> -<div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>  m_Size{0},</div> -<div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>  m_pUserData{VMA_NULL},</div> -<div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>  m_LastUseFrameIndex{currentFrameIndex},</div> -<div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>  m_MemoryTypeIndex{0},</div> -<div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>  m_Type{(uint8_t)ALLOCATION_TYPE_NONE},</div> -<div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>  m_SuballocationType{(uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN},</div> -<div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>  m_MapCount{0},</div> -<div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>  m_Flags{userDataString ? (uint8_t)FLAG_USER_DATA_STRING : (uint8_t)0}</div> -<div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>  {</div> -<div class="line"><a name="l06089"></a><span class="lineno"> 6089</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>  m_CreationFrameIndex = currentFrameIndex;</div> -<div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>  m_BufferImageUsage = 0;</div> -<div class="line"><a name="l06092"></a><span class="lineno"> 6092</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>  }</div> -<div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>  </div> -<div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>  ~VmaAllocation_T()</div> -<div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>  {</div> -<div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>  VMA_ASSERT((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 && <span class="stringliteral">"Allocation was not unmapped before destruction."</span>);</div> -<div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>  </div> -<div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>  <span class="comment">// Check if owned string was freed.</span></div> -<div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>  VMA_ASSERT(m_pUserData == VMA_NULL);</div> -<div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>  }</div> -<div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>  </div> -<div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>  <span class="keywordtype">void</span> InitBlockAllocation(</div> -<div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>  VmaDeviceMemoryBlock* block,</div> -<div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>  VkDeviceSize size,</div> -<div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>  uint32_t memoryTypeIndex,</div> -<div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>  VmaSuballocationType suballocationType,</div> -<div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>  <span class="keywordtype">bool</span> mapped,</div> -<div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>  <span class="keywordtype">bool</span> canBecomeLost)</div> -<div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>  {</div> -<div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> -<div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>  VMA_ASSERT(block != VMA_NULL);</div> -<div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>  m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div> -<div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>  m_Alignment = alignment;</div> -<div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>  m_Size = size;</div> -<div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>  m_MemoryTypeIndex = memoryTypeIndex;</div> -<div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>  m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div> -<div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>  m_SuballocationType = (uint8_t)suballocationType;</div> -<div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>  m_BlockAllocation.m_Block = block;</div> -<div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>  m_BlockAllocation.m_Offset = offset;</div> -<div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>  m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div> -<div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>  }</div> -<div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>  </div> -<div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>  <span class="keywordtype">void</span> InitLost()</div> +<div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>  const_iterator operator++(<span class="keywordtype">int</span>)</div> +<div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>  {</div> +<div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>  const_iterator result = *<span class="keyword">this</span>;</div> +<div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>  ++*<span class="keyword">this</span>;</div> +<div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>  }</div> +<div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>  const_iterator operator--(<span class="keywordtype">int</span>)</div> +<div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>  {</div> +<div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>  const_iterator result = *<span class="keyword">this</span>;</div> +<div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>  --*<span class="keyword">this</span>;</div> +<div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>  }</div> +<div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>  </div> +<div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l06010"></a><span class="lineno"> 6010</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> +<div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>  <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div> +<div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>  }</div> +<div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l06015"></a><span class="lineno"> 6015</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>  VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div> +<div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>  <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div> +<div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>  }</div> +<div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>  </div> +<div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>  const_iterator(<span class="keyword">const</span> VmaRawList<T>* pList, <span class="keyword">const</span> VmaListItem<T>* pItem) :</div> +<div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>  m_pList(pList),</div> +<div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>  m_pItem(pItem)</div> +<div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>  {</div> +<div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>  }</div> +<div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>  </div> +<div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>  <span class="keyword">const</span> VmaRawList<T>* m_pList;</div> +<div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>  <span class="keyword">const</span> VmaListItem<T>* m_pItem;</div> +<div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>  </div> +<div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaList<T, AllocatorT>;</div> +<div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>  };</div> +<div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>  </div> +<div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>  VmaList(<span class="keyword">const</span> AllocatorT& allocator) : m_RawList(allocator.m_pCallbacks) { }</div> +<div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>  </div> +<div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>  <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div> +<div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div> +<div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>  </div> +<div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>  iterator begin() { <span class="keywordflow">return</span> iterator(&m_RawList, m_RawList.Front()); }</div> +<div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>  iterator end() { <span class="keywordflow">return</span> iterator(&m_RawList, VMA_NULL); }</div> +<div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>  </div> +<div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>  const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&m_RawList, m_RawList.Front()); }</div> +<div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>  const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&m_RawList, VMA_NULL); }</div> +<div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>  </div> +<div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>  <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div> +<div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>  <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& value) { m_RawList.PushBack(value); }</div> +<div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>  <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div> +<div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>  iterator insert(iterator it, <span class="keyword">const</span> T& value) { <span class="keywordflow">return</span> iterator(&m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div> +<div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>  </div> +<div class="line"><a name="l06049"></a><span class="lineno"> 6049</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>  VmaRawList<T> m_RawList;</div> +<div class="line"><a name="l06051"></a><span class="lineno"> 6051</span> };</div> +<div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>  </div> +<div class="line"><a name="l06053"></a><span class="lineno"> 6053</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_LIST</span></div> +<div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>  </div> +<div class="line"><a name="l06056"></a><span class="lineno"> 6056</span> <span class="comment">// class VmaIntrusiveLinkedList</span></div> +<div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>  </div> +<div class="line"><a name="l06058"></a><span class="lineno"> 6058</span> <span class="comment">/*</span></div> +<div class="line"><a name="l06059"></a><span class="lineno"> 6059</span> <span class="comment">Expected interface of ItemTypeTraits:</span></div> +<div class="line"><a name="l06060"></a><span class="lineno"> 6060</span> <span class="comment">struct MyItemTypeTraits</span></div> +<div class="line"><a name="l06061"></a><span class="lineno"> 6061</span> <span class="comment">{</span></div> +<div class="line"><a name="l06062"></a><span class="lineno"> 6062</span> <span class="comment"> typedef MyItem ItemType;</span></div> +<div class="line"><a name="l06063"></a><span class="lineno"> 6063</span> <span class="comment"> static ItemType* GetPrev(const ItemType* item) { return item->myPrevPtr; }</span></div> +<div class="line"><a name="l06064"></a><span class="lineno"> 6064</span> <span class="comment"> static ItemType* GetNext(const ItemType* item) { return item->myNextPtr; }</span></div> +<div class="line"><a name="l06065"></a><span class="lineno"> 6065</span> <span class="comment"> static ItemType*& AccessPrev(ItemType* item) { return item->myPrevPtr; }</span></div> +<div class="line"><a name="l06066"></a><span class="lineno"> 6066</span> <span class="comment"> static ItemType*& AccessNext(ItemType* item) { return item->myNextPtr; }</span></div> +<div class="line"><a name="l06067"></a><span class="lineno"> 6067</span> <span class="comment">};</span></div> +<div class="line"><a name="l06068"></a><span class="lineno"> 6068</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06069"></a><span class="lineno"> 6069</span> <span class="keyword">template</span><<span class="keyword">typename</span> ItemTypeTraits></div> +<div class="line"><a name="l06070"></a><span class="lineno"> 6070</span> <span class="keyword">class </span>VmaIntrusiveLinkedList</div> +<div class="line"><a name="l06071"></a><span class="lineno"> 6071</span> {</div> +<div class="line"><a name="l06072"></a><span class="lineno"> 6072</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> ItemTypeTraits::ItemType ItemType;</div> +<div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>  <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> ItemTypeTraits::GetPrev(item); }</div> +<div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>  <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> ItemTypeTraits::GetNext(item); }</div> +<div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>  <span class="comment">// Movable, not copyable.</span></div> +<div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>  VmaIntrusiveLinkedList() { }</div> +<div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>  VmaIntrusiveLinkedList(<span class="keyword">const</span> VmaIntrusiveLinkedList<ItemTypeTraits>& src) = <span class="keyword">delete</span>;</div> +<div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>  VmaIntrusiveLinkedList(VmaIntrusiveLinkedList<ItemTypeTraits>&& src) :</div> +<div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>  m_Front(src.m_Front), m_Back(src.m_Back), m_Count(src.m_Count)</div> +<div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>  {</div> +<div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>  src.m_Front = src.m_Back = VMA_NULL;</div> +<div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>  src.m_Count = 0;</div> +<div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>  }</div> +<div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>  ~VmaIntrusiveLinkedList()</div> +<div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>  {</div> +<div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>  VMA_HEAVY_ASSERT(IsEmpty());</div> +<div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>  }</div> +<div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>  VmaIntrusiveLinkedList<ItemTypeTraits>& operator=(<span class="keyword">const</span> VmaIntrusiveLinkedList<ItemTypeTraits>& src) = <span class="keyword">delete</span>;</div> +<div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>  VmaIntrusiveLinkedList<ItemTypeTraits>& operator=(VmaIntrusiveLinkedList<ItemTypeTraits>&& src)</div> +<div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>  {</div> +<div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>  <span class="keywordflow">if</span>(&src != <span class="keyword">this</span>)</div> +<div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>  {</div> +<div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>  VMA_HEAVY_ASSERT(IsEmpty());</div> +<div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>  m_Front = src.m_Front;</div> +<div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>  m_Back = src.m_Back;</div> +<div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>  m_Count = src.m_Count;</div> +<div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>  src.m_Front = src.m_Back = VMA_NULL;</div> +<div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>  src.m_Count = 0;</div> +<div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>  }</div> +<div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> +<div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>  }</div> +<div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>  <span class="keywordtype">void</span> RemoveAll()</div> +<div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>  {</div> +<div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>  <span class="keywordflow">if</span>(!IsEmpty())</div> +<div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>  {</div> +<div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>  ItemType* item = m_Back;</div> +<div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>  <span class="keywordflow">while</span>(item != VMA_NULL)</div> +<div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>  {</div> +<div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>  ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::AccessPrev(item);</div> +<div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>  ItemTypeTraits::AccessPrev(item) = VMA_NULL;</div> +<div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>  ItemTypeTraits::AccessNext(item) = VMA_NULL;</div> +<div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>  item = prevItem;</div> +<div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>  }</div> +<div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>  m_Front = VMA_NULL;</div> +<div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>  m_Back = VMA_NULL;</div> +<div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>  m_Count = 0;</div> +<div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>  }</div> +<div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>  }</div> +<div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>  <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div> +<div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>  <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div> +<div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>  ItemType* Front() { <span class="keywordflow">return</span> m_Front; }</div> +<div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>  <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Front; }</div> +<div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>  ItemType* Back() { <span class="keywordflow">return</span> m_Back; }</div> +<div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>  <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Back; }</div> +<div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>  <span class="keywordtype">void</span> PushBack(ItemType* item)</div> <div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>  {</div> -<div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> -<div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>  VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div> -<div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>  m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div> -<div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>  m_MemoryTypeIndex = 0;</div> -<div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>  m_BlockAllocation.m_Block = VMA_NULL;</div> -<div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>  m_BlockAllocation.m_Offset = 0;</div> -<div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>  m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div> -<div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>  }</div> -<div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>  </div> -<div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>  <span class="keywordtype">void</span> ChangeBlockAllocation(</div> -<div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>  VmaDeviceMemoryBlock* block,</div> -<div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>  VkDeviceSize offset); </div> -<div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>  </div> -<div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>  <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</div> -<div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>  </div> -<div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>  <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div> -<div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>  <span class="keywordtype">void</span> InitDedicatedAllocation(</div> -<div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>  uint32_t memoryTypeIndex,</div> -<div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>  VkDeviceMemory hMemory,</div> -<div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>  VmaSuballocationType suballocationType,</div> -<div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>  <span class="keywordtype">void</span>* pMappedData,</div> -<div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>  VkDeviceSize size)</div> -<div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>  {</div> -<div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> -<div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>  VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div> -<div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>  m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div> -<div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>  m_Alignment = 0;</div> -<div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>  m_Size = size;</div> -<div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>  m_MemoryTypeIndex = memoryTypeIndex;</div> -<div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>  m_SuballocationType = (uint8_t)suballocationType;</div> -<div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>  m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div> -<div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>  m_DedicatedAllocation.m_hMemory = hMemory;</div> -<div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>  m_DedicatedAllocation.m_pMappedData = pMappedData;</div> -<div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>  }</div> -<div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>  </div> -<div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>  ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div> -<div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>  VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div> -<div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>  VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div> -<div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>  <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags & FLAG_USER_DATA_STRING) != 0; }</div> -<div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>  <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div> -<div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>  <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div> -<div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>  VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div> -<div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>  </div> -<div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>  VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div> -<div class="line"><a name="l06173"></a><span class="lineno"> 6173</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> -<div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div> -<div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>  }</div> -<div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>  VkDeviceSize GetOffset() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>  VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> -<div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>  <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount & MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div> -<div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>  <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>  <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>  </div> -<div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>  uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div> -<div class="line"><a name="l06185"></a><span class="lineno"> 6185</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>  <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div> -<div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>  }</div> -<div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>  <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t& expected, uint32_t desired)</div> -<div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>  {</div> -<div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>  <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div> -<div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>  }</div> -<div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06193"></a><span class="lineno"> 6193</span> <span class="comment"> - If hAllocation.LastUseFrameIndex + frameInUseCount < allocator.CurrentFrameIndex,</span></div> -<div class="line"><a name="l06194"></a><span class="lineno"> 6194</span> <span class="comment"> makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div> -<div class="line"><a name="l06195"></a><span class="lineno"> 6195</span> <span class="comment"> - Else, returns false.</span></div> -<div class="line"><a name="l06196"></a><span class="lineno"> 6196</span> <span class="comment"> </span></div> -<div class="line"><a name="l06197"></a><span class="lineno"> 6197</span> <span class="comment"> If hAllocation is already lost, assert - you should not call it then.</span></div> -<div class="line"><a name="l06198"></a><span class="lineno"> 6198</span> <span class="comment"> If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div> -<div class="line"><a name="l06199"></a><span class="lineno"> 6199</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>  <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> -<div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>  </div> -<div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>  <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)</div> -<div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>  {</div> -<div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div> -<div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> -<div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div> -<div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> -<div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div> -<div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div> -<div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div> -<div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> -<div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>  }</div> -<div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>  </div> -<div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>  <span class="keywordtype">void</span> BlockAllocMap();</div> -<div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>  <span class="keywordtype">void</span> BlockAllocUnmap();</div> -<div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>  VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div> -<div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>  <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>  </div> -<div class="line"><a name="l06220"></a><span class="lineno"> 6220</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>  uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div> -<div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>  uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div> -<div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>  </div> -<div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>  <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div> -<div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>  {</div> -<div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>  VMA_ASSERT(m_BufferImageUsage == 0);</div> -<div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>  m_BufferImageUsage = bufferImageUsage;</div> -<div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>  }</div> -<div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>  </div> -<div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>  <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06231"></a><span class="lineno"> 6231</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>  </div> -<div class="line"><a name="l06233"></a><span class="lineno"> 6233</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>  VkDeviceSize m_Alignment;</div> -<div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>  VkDeviceSize m_Size;</div> -<div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>  <span class="keywordtype">void</span>* m_pUserData;</div> -<div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>  VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div> -<div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>  uint32_t m_MemoryTypeIndex;</div> -<div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>  uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div> -<div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>  uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div> -<div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>  <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div> -<div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>  <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div> -<div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>  uint8_t m_MapCount;</div> -<div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>  uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div> -<div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>  </div> -<div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>  <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div> -<div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>  <span class="keyword">struct </span>BlockAllocation</div> -<div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>  {</div> -<div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>  VmaDeviceMemoryBlock* m_Block;</div> -<div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>  VkDeviceSize m_Offset;</div> -<div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>  <span class="keywordtype">bool</span> m_CanBecomeLost;</div> -<div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>  };</div> -<div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>  </div> -<div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>  <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div> -<div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>  <span class="keyword">struct </span>DedicatedAllocation</div> -<div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>  {</div> -<div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>  VkDeviceMemory m_hMemory;</div> -<div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>  <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div> -<div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>  };</div> -<div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>  </div> -<div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>  <span class="keyword">union</span></div> -<div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>  {</div> -<div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>  <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div> -<div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>  BlockAllocation m_BlockAllocation;</div> -<div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>  <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div> -<div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>  DedicatedAllocation m_DedicatedAllocation;</div> -<div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>  };</div> -<div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>  </div> -<div class="line"><a name="l06269"></a><span class="lineno"> 6269</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>  uint32_t m_CreationFrameIndex;</div> -<div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>  uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div> -<div class="line"><a name="l06272"></a><span class="lineno"> 6272</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>  VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);</div> +<div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>  {</div> +<div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>  m_Front = item;</div> +<div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>  m_Back = item;</div> +<div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>  m_Count = 1;</div> +<div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>  }</div> +<div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>  {</div> +<div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>  ItemTypeTraits::AccessPrev(item) = m_Back;</div> +<div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>  ItemTypeTraits::AccessNext(m_Back) = item;</div> +<div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>  m_Back = item;</div> +<div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>  ++m_Count;</div> +<div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>  }</div> +<div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>  }</div> +<div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>  <span class="keywordtype">void</span> PushFront(ItemType* item)</div> +<div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>  {</div> +<div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>  VMA_HEAVY_ASSERT(ItemTypeTraits::GetPrev(item) == VMA_NULL && ItemTypeTraits::GetNext(item) == VMA_NULL);</div> +<div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>  {</div> +<div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>  m_Front = item;</div> +<div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>  m_Back = item;</div> +<div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>  m_Count = 1;</div> +<div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>  }</div> +<div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>  {</div> +<div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>  ItemTypeTraits::AccessNext(item) = m_Front;</div> +<div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>  ItemTypeTraits::AccessPrev(m_Front) = item;</div> +<div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>  m_Front = item;</div> +<div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>  ++m_Count;</div> +<div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>  }</div> +<div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>  }</div> +<div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>  ItemType* PopBack()</div> +<div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>  {</div> +<div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>  ItemType* <span class="keyword">const</span> backItem = m_Back;</div> +<div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>  ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::GetPrev(backItem);</div> +<div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>  <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div> +<div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>  {</div> +<div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>  ItemTypeTraits::AccessNext(prevItem) = VMA_NULL;</div> +<div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>  }</div> +<div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>  m_Back = prevItem;</div> +<div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>  --m_Count;</div> +<div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>  ItemTypeTraits::AccessPrev(backItem) = VMA_NULL;</div> +<div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>  ItemTypeTraits::AccessNext(backItem) = VMA_NULL;</div> +<div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>  <span class="keywordflow">return</span> backItem;</div> +<div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>  }</div> +<div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>  ItemType* PopFront()</div> +<div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>  {</div> +<div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>  VMA_HEAVY_ASSERT(m_Count > 0);</div> +<div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>  ItemType* <span class="keyword">const</span> frontItem = m_Front;</div> +<div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>  ItemType* <span class="keyword">const</span> nextItem = ItemTypeTraits::GetNext(frontItem);</div> +<div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>  <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div> +<div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>  {</div> +<div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>  ItemTypeTraits::AccessPrev(nextItem) = VMA_NULL;</div> +<div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>  }</div> +<div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>  m_Front = nextItem;</div> +<div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>  --m_Count;</div> +<div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>  ItemTypeTraits::AccessPrev(frontItem) = VMA_NULL;</div> +<div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>  ItemTypeTraits::AccessNext(frontItem) = VMA_NULL;</div> +<div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>  <span class="keywordflow">return</span> frontItem;</div> +<div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>  }</div> +<div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>  </div> +<div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>  <span class="comment">// MyItem can be null - it means PushBack.</span></div> +<div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>  <span class="keywordtype">void</span> InsertBefore(ItemType* existingItem, ItemType* newItem)</div> +<div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>  {</div> +<div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>  VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);</div> +<div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>  <span class="keywordflow">if</span>(existingItem != VMA_NULL)</div> +<div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>  {</div> +<div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>  ItemType* <span class="keyword">const</span> prevItem = ItemTypeTraits::GetPrev(existingItem);</div> +<div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>  ItemTypeTraits::AccessPrev(newItem) = prevItem;</div> +<div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>  ItemTypeTraits::AccessNext(newItem) = existingItem;</div> +<div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>  ItemTypeTraits::AccessPrev(existingItem) = newItem;</div> +<div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>  <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div> +<div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>  {</div> +<div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>  ItemTypeTraits::AccessNext(prevItem) = newItem;</div> +<div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>  }</div> +<div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>  {</div> +<div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>  VMA_HEAVY_ASSERT(m_Front == existingItem);</div> +<div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>  m_Front = newItem;</div> +<div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>  }</div> +<div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>  ++m_Count;</div> +<div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>  }</div> +<div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>  PushBack(newItem);</div> +<div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>  }</div> +<div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>  <span class="comment">// MyItem can be null - it means PushFront.</span></div> +<div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>  <span class="keywordtype">void</span> InsertAfter(ItemType* existingItem, ItemType* newItem)</div> +<div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>  {</div> +<div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>  VMA_HEAVY_ASSERT(newItem != VMA_NULL && ItemTypeTraits::GetPrev(newItem) == VMA_NULL && ItemTypeTraits::GetNext(newItem) == VMA_NULL);</div> +<div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>  <span class="keywordflow">if</span>(existingItem != VMA_NULL)</div> +<div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>  {</div> +<div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>  ItemType* <span class="keyword">const</span> nextItem = ItemTypeTraits::GetNext(existingItem);</div> +<div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>  ItemTypeTraits::AccessNext(newItem) = nextItem;</div> +<div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>  ItemTypeTraits::AccessPrev(newItem) = existingItem;</div> +<div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>  ItemTypeTraits::AccessNext(existingItem) = newItem;</div> +<div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>  <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div> +<div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>  {</div> +<div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>  ItemTypeTraits::AccessPrev(nextItem) = newItem;</div> +<div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>  }</div> +<div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>  {</div> +<div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>  VMA_HEAVY_ASSERT(m_Back == existingItem);</div> +<div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>  m_Back = newItem;</div> +<div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>  }</div> +<div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>  ++m_Count;</div> +<div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>  }</div> +<div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>  <span class="keywordflow">return</span> PushFront(newItem);</div> +<div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>  }</div> +<div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>  <span class="keywordtype">void</span> Remove(ItemType* item)</div> +<div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>  {</div> +<div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>  VMA_HEAVY_ASSERT(item != VMA_NULL && m_Count > 0);</div> +<div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>  <span class="keywordflow">if</span>(ItemTypeTraits::GetPrev(item) != VMA_NULL)</div> +<div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>  {</div> +<div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>  ItemTypeTraits::AccessNext(ItemTypeTraits::AccessPrev(item)) = ItemTypeTraits::GetNext(item);</div> +<div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>  }</div> +<div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>  {</div> +<div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>  VMA_HEAVY_ASSERT(m_Front == item);</div> +<div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>  m_Front = ItemTypeTraits::GetNext(item);</div> +<div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>  }</div> +<div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>  </div> +<div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>  <span class="keywordflow">if</span>(ItemTypeTraits::GetNext(item) != VMA_NULL)</div> +<div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>  {</div> +<div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>  ItemTypeTraits::AccessPrev(ItemTypeTraits::AccessNext(item)) = ItemTypeTraits::GetPrev(item);</div> +<div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>  }</div> +<div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>  {</div> +<div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>  VMA_HEAVY_ASSERT(m_Back == item);</div> +<div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>  m_Back = ItemTypeTraits::GetPrev(item);</div> +<div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>  }</div> +<div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>  ItemTypeTraits::AccessPrev(item) = VMA_NULL;</div> +<div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>  ItemTypeTraits::AccessNext(item) = VMA_NULL;</div> +<div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>  --m_Count;</div> +<div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>  }</div> +<div class="line"><a name="l06265"></a><span class="lineno"> 6265</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>  ItemType* m_Front = VMA_NULL;</div> +<div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>  ItemType* m_Back = VMA_NULL;</div> +<div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>  <span class="keywordtype">size_t</span> m_Count = 0;</div> +<div class="line"><a name="l06269"></a><span class="lineno"> 6269</span> };</div> +<div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>  </div> +<div class="line"><a name="l06272"></a><span class="lineno"> 6272</span> <span class="comment">// class VmaMap</span></div> <div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>  </div> -<div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>  <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06275"></a><span class="lineno"> 6275</span> };</div> +<div class="line"><a name="l06274"></a><span class="lineno"> 6274</span> <span class="comment">// Unused in this version.</span></div> +<div class="line"><a name="l06275"></a><span class="lineno"> 6275</span> <span class="preprocessor">#if 0</span></div> <div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>  </div> -<div class="line"><a name="l06277"></a><span class="lineno"> 6277</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06278"></a><span class="lineno"> 6278</span> <span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div> -<div class="line"><a name="l06279"></a><span class="lineno"> 6279</span> <span class="comment">allocated memory block or free.</span></div> -<div class="line"><a name="l06280"></a><span class="lineno"> 6280</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06281"></a><span class="lineno"> 6281</span> <span class="keyword">struct </span>VmaSuballocation</div> -<div class="line"><a name="l06282"></a><span class="lineno"> 6282</span> {</div> -<div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>  VkDeviceSize offset;</div> -<div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>  VkDeviceSize size;</div> -<div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div> -<div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>  VmaSuballocationType type;</div> -<div class="line"><a name="l06287"></a><span class="lineno"> 6287</span> };</div> -<div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>  </div> -<div class="line"><a name="l06289"></a><span class="lineno"> 6289</span> <span class="comment">// Comparator for offsets.</span></div> -<div class="line"><a name="l06290"></a><span class="lineno"> 6290</span> <span class="keyword">struct </span>VmaSuballocationOffsetLess</div> -<div class="line"><a name="l06291"></a><span class="lineno"> 6291</span> {</div> -<div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation& lhs, <span class="keyword">const</span> VmaSuballocation& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l06293"></a><span class="lineno"> 6293</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>  <span class="keywordflow">return</span> lhs.offset < rhs.offset;</div> -<div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>  }</div> -<div class="line"><a name="l06296"></a><span class="lineno"> 6296</span> };</div> -<div class="line"><a name="l06297"></a><span class="lineno"> 6297</span> <span class="keyword">struct </span>VmaSuballocationOffsetGreater</div> -<div class="line"><a name="l06298"></a><span class="lineno"> 6298</span> {</div> -<div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation& lhs, <span class="keyword">const</span> VmaSuballocation& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l06300"></a><span class="lineno"> 6300</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>  <span class="keywordflow">return</span> lhs.offset > rhs.offset;</div> -<div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>  }</div> -<div class="line"><a name="l06303"></a><span class="lineno"> 6303</span> };</div> -<div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>  </div> -<div class="line"><a name="l06305"></a><span class="lineno"> 6305</span> <span class="keyword">typedef</span> VmaList< VmaSuballocation, VmaStlAllocator<VmaSuballocation> > VmaSuballocationList;</div> -<div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>  </div> -<div class="line"><a name="l06307"></a><span class="lineno"> 6307</span> <span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div> -<div class="line"><a name="l06308"></a><span class="lineno"> 6308</span> <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div> -<div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>  </div> -<div class="line"><a name="l06310"></a><span class="lineno"> 6310</span> <span class="keyword">enum class</span> VmaAllocationRequestType</div> -<div class="line"><a name="l06311"></a><span class="lineno"> 6311</span> {</div> -<div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>  Normal,</div> -<div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>  <span class="comment">// Used by "Linear" algorithm.</span></div> -<div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>  UpperAddress,</div> -<div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>  EndOf1st,</div> -<div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>  EndOf2nd,</div> +<div class="line"><a name="l06277"></a><span class="lineno"> 6277</span> <span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div> +<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="preprocessor">#define VmaPair std::pair</span></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="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div> +<div class="line"><a name="l06282"></a><span class="lineno"> 6282</span> <span class="preprocessor"> std::unordered_map< KeyT, ValueT, std::hash<KeyT>, std::equal_to<KeyT>, VmaStlAllocator< std::pair<KeyT, ValueT> > ></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> <span class="preprocessor">#else </span><span class="comment">// #if VMA_USE_STL_UNORDERED_MAP</span></div> +<div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>  </div> +<div class="line"><a name="l06286"></a><span class="lineno"> 6286</span> <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2></div> +<div class="line"><a name="l06287"></a><span class="lineno"> 6287</span> <span class="keyword">struct </span>VmaPair</div> +<div class="line"><a name="l06288"></a><span class="lineno"> 6288</span> {</div> +<div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>  T1 first;</div> +<div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>  T2 second;</div> +<div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>  </div> +<div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>  VmaPair() : first(), second() { }</div> +<div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>  VmaPair(<span class="keyword">const</span> T1& firstSrc, <span class="keyword">const</span> T2& secondSrc) : first(firstSrc), second(secondSrc) { }</div> +<div class="line"><a name="l06294"></a><span class="lineno"> 6294</span> };</div> +<div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>  </div> +<div class="line"><a name="l06296"></a><span class="lineno"> 6296</span> <span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div> +<div class="line"><a name="l06297"></a><span class="lineno"> 6297</span> <span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div> +<div class="line"><a name="l06298"></a><span class="lineno"> 6298</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06299"></a><span class="lineno"> 6299</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> +<div class="line"><a name="l06300"></a><span class="lineno"> 6300</span> <span class="keyword">class </span>VmaMap</div> +<div class="line"><a name="l06301"></a><span class="lineno"> 6301</span> {</div> +<div class="line"><a name="l06302"></a><span class="lineno"> 6302</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>  <span class="keyword">typedef</span> VmaPair<KeyT, ValueT> PairType;</div> +<div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>  <span class="keyword">typedef</span> PairType* iterator;</div> +<div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>  </div> +<div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>  VmaMap(<span class="keyword">const</span> VmaStlAllocator<PairType>& allocator) : m_Vector(allocator) { }</div> +<div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>  </div> +<div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>  iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div> +<div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>  iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div> +<div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>  </div> +<div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>  <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType& pair);</div> +<div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>  iterator find(<span class="keyword">const</span> KeyT& key);</div> +<div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>  <span class="keywordtype">void</span> erase(iterator it);</div> +<div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>  </div> +<div class="line"><a name="l06315"></a><span class="lineno"> 6315</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>  VmaVector< PairType, VmaStlAllocator<PairType> > m_Vector;</div> <div class="line"><a name="l06317"></a><span class="lineno"> 6317</span> };</div> <div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>  </div> -<div class="line"><a name="l06319"></a><span class="lineno"> 6319</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06320"></a><span class="lineno"> 6320</span> <span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div> -<div class="line"><a name="l06321"></a><span class="lineno"> 6321</span> <span class="comment"></span> </div> -<div class="line"><a name="l06322"></a><span class="lineno"> 6322</span> <span class="comment">If canMakeOtherLost was false:</span></div> -<div class="line"><a name="l06323"></a><span class="lineno"> 6323</span> <span class="comment">- item points to a FREE suballocation.</span></div> -<div class="line"><a name="l06324"></a><span class="lineno"> 6324</span> <span class="comment">- itemsToMakeLostCount is 0.</span></div> -<div class="line"><a name="l06325"></a><span class="lineno"> 6325</span> <span class="comment"></span> </div> -<div class="line"><a name="l06326"></a><span class="lineno"> 6326</span> <span class="comment">If canMakeOtherLost was true:</span></div> -<div class="line"><a name="l06327"></a><span class="lineno"> 6327</span> <span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div> -<div class="line"><a name="l06328"></a><span class="lineno"> 6328</span> <span class="comment"> or point to VmaAllocations that can become lost.</span></div> -<div class="line"><a name="l06329"></a><span class="lineno"> 6329</span> <span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div> -<div class="line"><a name="l06330"></a><span class="lineno"> 6330</span> <span class="comment"> the requested allocation to succeed.</span></div> -<div class="line"><a name="l06331"></a><span class="lineno"> 6331</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06332"></a><span class="lineno"> 6332</span> <span class="keyword">struct </span>VmaAllocationRequest</div> -<div class="line"><a name="l06333"></a><span class="lineno"> 6333</span> {</div> -<div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>  VkDeviceSize offset;</div> -<div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>  VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div> -<div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>  VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div> -<div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>  VmaSuballocationList::iterator item;</div> -<div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>  <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div> -<div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>  <span class="keywordtype">void</span>* customData;</div> -<div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>  VmaAllocationRequestType type;</div> -<div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>  </div> -<div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>  VkDeviceSize CalcCost()<span class="keyword"> const</span></div> -<div class="line"><a name="l06343"></a><span class="lineno"> 6343</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>  <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div> -<div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>  }</div> -<div class="line"><a name="l06346"></a><span class="lineno"> 6346</span> };</div> -<div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>  </div> -<div class="line"><a name="l06348"></a><span class="lineno"> 6348</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06349"></a><span class="lineno"> 6349</span> <span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div> -<div class="line"><a name="l06350"></a><span class="lineno"> 6350</span> <span class="comment">in a single VkDeviceMemory block.</span></div> -<div class="line"><a name="l06351"></a><span class="lineno"> 6351</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06352"></a><span class="lineno"> 6352</span> <span class="keyword">class </span>VmaBlockMetadata</div> -<div class="line"><a name="l06353"></a><span class="lineno"> 6353</span> {</div> -<div class="line"><a name="l06354"></a><span class="lineno"> 6354</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>  VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div> -<div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</div> -<div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>  </div> -<div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>  <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div> -<div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>  VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div> -<div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>  <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div> -<div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>  </div> -<div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>  <span class="comment">// Shouldn't modify blockCount.</span></div> -<div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>  </div> -<div class="line"><a name="l06372"></a><span class="lineno"> 6372</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l06374"></a><span class="lineno"> 6374</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>  </div> -<div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>  <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div> -<div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>  <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div> -<div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>  <span class="comment">// If failed, returns false.</span></div> -<div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> -<div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>  <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div> -<div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>  uint32_t strategy,</div> -<div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>  VmaAllocationRequest* pAllocationRequest) = 0;</div> -<div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>  </div> -<div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>  VmaAllocationRequest* pAllocationRequest) = 0;</div> +<div class="line"><a name="l06319"></a><span class="lineno"> 6319</span> <span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap<KeyT, ValueT></span></div> +<div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>  </div> +<div class="line"><a name="l06321"></a><span class="lineno"> 6321</span> <span class="keyword">template</span><<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT></div> +<div class="line"><a name="l06322"></a><span class="lineno"> 6322</span> <span class="keyword">struct </span>VmaPairFirstLess</div> +<div class="line"><a name="l06323"></a><span class="lineno"> 6323</span> {</div> +<div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair<FirstT, SecondT>& lhs, <span class="keyword">const</span> VmaPair<FirstT, SecondT>& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l06325"></a><span class="lineno"> 6325</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>  <span class="keywordflow">return</span> lhs.first < rhs.first;</div> +<div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>  }</div> +<div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair<FirstT, SecondT>& lhs, <span class="keyword">const</span> FirstT& rhsFirst)<span class="keyword"> const</span></div> +<div class="line"><a name="l06329"></a><span class="lineno"> 6329</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>  <span class="keywordflow">return</span> lhs.first < rhsFirst;</div> +<div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>  }</div> +<div class="line"><a name="l06332"></a><span class="lineno"> 6332</span> };</div> +<div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>  </div> +<div class="line"><a name="l06334"></a><span class="lineno"> 6334</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> +<div class="line"><a name="l06335"></a><span class="lineno"> 6335</span> <span class="keywordtype">void</span> VmaMap<KeyT, ValueT>::insert(<span class="keyword">const</span> PairType& pair)</div> +<div class="line"><a name="l06336"></a><span class="lineno"> 6336</span> {</div> +<div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>  m_Vector.data(),</div> +<div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>  m_Vector.data() + m_Vector.size(),</div> +<div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>  pair,</div> +<div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>  VmaPairFirstLess<KeyT, ValueT>()) - m_Vector.data();</div> +<div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>  VmaVectorInsert(m_Vector, indexToInsert, pair);</div> +<div class="line"><a name="l06343"></a><span class="lineno"> 6343</span> }</div> +<div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>  </div> +<div class="line"><a name="l06345"></a><span class="lineno"> 6345</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> +<div class="line"><a name="l06346"></a><span class="lineno"> 6346</span> VmaPair<KeyT, ValueT>* VmaMap<KeyT, ValueT>::find(<span class="keyword">const</span> KeyT& key)</div> +<div class="line"><a name="l06347"></a><span class="lineno"> 6347</span> {</div> +<div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>  PairType* it = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>  m_Vector.data(),</div> +<div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>  m_Vector.data() + m_Vector.size(),</div> +<div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>  key,</div> +<div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>  VmaPairFirstLess<KeyT, ValueT>());</div> +<div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>  <span class="keywordflow">if</span>((it != m_Vector.end()) && (it->first == key))</div> +<div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>  {</div> +<div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>  <span class="keywordflow">return</span> it;</div> +<div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>  }</div> +<div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>  {</div> +<div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>  <span class="keywordflow">return</span> m_Vector.end();</div> +<div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>  }</div> +<div class="line"><a name="l06361"></a><span class="lineno"> 6361</span> }</div> +<div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>  </div> +<div class="line"><a name="l06363"></a><span class="lineno"> 6363</span> <span class="keyword">template</span><<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT></div> +<div class="line"><a name="l06364"></a><span class="lineno"> 6364</span> <span class="keywordtype">void</span> VmaMap<KeyT, ValueT>::erase(iterator it)</div> +<div class="line"><a name="l06365"></a><span class="lineno"> 6365</span> {</div> +<div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>  VmaVectorRemove(m_Vector, it - m_Vector.begin());</div> +<div class="line"><a name="l06367"></a><span class="lineno"> 6367</span> }</div> +<div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>  </div> +<div class="line"><a name="l06369"></a><span class="lineno"> 6369</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_USE_STL_UNORDERED_MAP</span></div> +<div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>  </div> +<div class="line"><a name="l06371"></a><span class="lineno"> 6371</span> <span class="preprocessor">#endif </span><span class="comment">// #if 0</span></div> +<div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>  </div> +<div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>  </div> +<div class="line"><a name="l06375"></a><span class="lineno"> 6375</span> <span class="keyword">class </span>VmaDeviceMemoryBlock;</div> +<div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>  </div> +<div class="line"><a name="l06377"></a><span class="lineno"> 6377</span> <span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div> +<div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>  </div> +<div class="line"><a name="l06379"></a><span class="lineno"> 6379</span> <span class="keyword">struct </span>VmaAllocation_T</div> +<div class="line"><a name="l06380"></a><span class="lineno"> 6380</span> {</div> +<div class="line"><a name="l06381"></a><span class="lineno"> 6381</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>  <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div> +<div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>  </div> +<div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>  <span class="keyword">enum</span> FLAGS</div> +<div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>  {</div> +<div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>  FLAG_USER_DATA_STRING = 0x01,</div> +<div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>  };</div> +<div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>  </div> +<div class="line"><a name="l06389"></a><span class="lineno"> 6389</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>  <span class="keyword">enum</span> ALLOCATION_TYPE</div> +<div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>  {</div> +<div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>  ALLOCATION_TYPE_NONE,</div> +<div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>  ALLOCATION_TYPE_BLOCK,</div> +<div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>  ALLOCATION_TYPE_DEDICATED,</div> +<div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>  };</div> <div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>  </div> -<div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</div> -<div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>  </div> -<div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div> +<div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l06398"></a><span class="lineno"> 6398</span> <span class="comment"> This struct is allocated using VmaPoolAllocator.</span></div> +<div class="line"><a name="l06399"></a><span class="lineno"> 6399</span> <span class="comment"> */</span></div> <div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>  </div> -<div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>  <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div> -<div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> -<div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div> -<div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>  </div> -<div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>  <span class="comment">// Frees suballocation assigned to given memory region.</span></div> -<div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div> -<div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div> -<div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>  </div> -<div class="line"><a name="l06412"></a><span class="lineno"> 6412</span> <span class="keyword">protected</span>:</div> -<div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>  <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</div> -<div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>  </div> -<div class="line"><a name="l06415"></a><span class="lineno"> 6415</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>  <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>  VkDeviceSize unusedBytes,</div> -<div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>  <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>  <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>  <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>  VkDeviceSize size) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>  <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06427"></a><span class="lineno"> 6427</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>  </div> -<div class="line"><a name="l06429"></a><span class="lineno"> 6429</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>  VkDeviceSize m_Size;</div> -<div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>  <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div> -<div class="line"><a name="l06432"></a><span class="lineno"> 6432</span> };</div> -<div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>  </div> -<div class="line"><a name="l06434"></a><span class="lineno"> 6434</span> <span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div> -<div class="line"><a name="l06435"></a><span class="lineno"> 6435</span> <span class="preprocessor"> VMA_ASSERT(0 && "Validation failed: " #cond); \</span></div> -<div class="line"><a name="l06436"></a><span class="lineno"> 6436</span> <span class="preprocessor"> return false; \</span></div> -<div class="line"><a name="l06437"></a><span class="lineno"> 6437</span> <span class="preprocessor"> } } while(false)</span></div> -<div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>  </div> -<div class="line"><a name="l06439"></a><span class="lineno"> 6439</span> <span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</div> -<div class="line"><a name="l06440"></a><span class="lineno"> 6440</span> {</div> -<div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div> -<div class="line"><a name="l06442"></a><span class="lineno"> 6442</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>  VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div> -<div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> -<div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>  </div> -<div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div> -<div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div> -<div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>  </div> -<div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>  </div> -<div class="line"><a name="l06456"></a><span class="lineno"> 6456</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06458"></a><span class="lineno"> 6458</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>  VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div> +<div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>  m_Alignment{1},</div> +<div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>  m_Size{0},</div> +<div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>  m_pUserData{VMA_NULL},</div> +<div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>  m_LastUseFrameIndex{currentFrameIndex},</div> +<div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>  m_MemoryTypeIndex{0},</div> +<div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>  m_Type{(uint8_t)ALLOCATION_TYPE_NONE},</div> +<div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>  m_SuballocationType{(uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN},</div> +<div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>  m_MapCount{0},</div> +<div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>  m_Flags{userDataString ? (uint8_t)FLAG_USER_DATA_STRING : (uint8_t)0}</div> +<div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>  {</div> +<div class="line"><a name="l06412"></a><span class="lineno"> 6412</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>  m_CreationFrameIndex = currentFrameIndex;</div> +<div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>  m_BufferImageUsage = 0;</div> +<div class="line"><a name="l06415"></a><span class="lineno"> 6415</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>  }</div> +<div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>  </div> +<div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>  ~VmaAllocation_T()</div> +<div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>  {</div> +<div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>  VMA_ASSERT((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 && <span class="stringliteral">"Allocation was not unmapped before destruction."</span>);</div> +<div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>  </div> +<div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>  <span class="comment">// Check if owned string was freed.</span></div> +<div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>  VMA_ASSERT(m_pUserData == VMA_NULL);</div> +<div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>  }</div> +<div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>  </div> +<div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>  <span class="keywordtype">void</span> InitBlockAllocation(</div> +<div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>  VmaDeviceMemoryBlock* block,</div> +<div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>  VkDeviceSize alignment,</div> +<div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>  VkDeviceSize size,</div> +<div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>  uint32_t memoryTypeIndex,</div> +<div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>  VmaSuballocationType suballocationType,</div> +<div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>  <span class="keywordtype">bool</span> mapped,</div> +<div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>  <span class="keywordtype">bool</span> canBecomeLost)</div> +<div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>  {</div> +<div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> +<div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>  VMA_ASSERT(block != VMA_NULL);</div> +<div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>  m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div> +<div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>  m_Alignment = alignment;</div> +<div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>  m_Size = size;</div> +<div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>  m_MemoryTypeIndex = memoryTypeIndex;</div> +<div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>  m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div> +<div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>  m_SuballocationType = (uint8_t)suballocationType;</div> +<div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>  m_BlockAllocation.m_Block = block;</div> +<div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>  m_BlockAllocation.m_Offset = offset;</div> +<div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>  m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div> +<div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>  }</div> +<div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>  </div> +<div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>  <span class="keywordtype">void</span> InitLost()</div> +<div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>  {</div> +<div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> +<div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>  VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div> +<div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>  m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div> +<div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>  m_MemoryTypeIndex = 0;</div> +<div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>  m_BlockAllocation.m_Block = VMA_NULL;</div> +<div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>  m_BlockAllocation.m_Offset = 0;</div> +<div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>  m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div> +<div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>  }</div> <div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>  </div> -<div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> -<div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>  uint32_t strategy,</div> -<div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>  </div> -<div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>  </div> -<div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> -<div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>  </div> -<div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div> -<div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>  </div> -<div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> -<div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>  </div> -<div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div> -<div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>  </div> -<div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>  <span class="comment">// For defragmentation</span></div> -<div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>  </div> -<div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>  <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div> -<div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>  VmaSuballocationType& inOutPrevSuballocType) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>  <span class="keywordtype">void</span> ChangeBlockAllocation(</div> +<div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>  VmaDeviceMemoryBlock* block,</div> +<div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>  VkDeviceSize offset);</div> +<div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>  </div> +<div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>  <span class="keywordtype">void</span> ChangeOffset(VkDeviceSize newOffset);</div> +<div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>  </div> +<div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>  <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div> +<div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>  <span class="keywordtype">void</span> InitDedicatedAllocation(</div> +<div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>  uint32_t memoryTypeIndex,</div> +<div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>  VkDeviceMemory hMemory,</div> +<div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>  VmaSuballocationType suballocationType,</div> +<div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>  <span class="keywordtype">void</span>* pMappedData,</div> +<div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>  VkDeviceSize size)</div> +<div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>  {</div> +<div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div> +<div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>  VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div> +<div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>  m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div> +<div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>  m_Alignment = 0;</div> +<div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>  m_Size = size;</div> +<div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>  m_MemoryTypeIndex = memoryTypeIndex;</div> +<div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>  m_SuballocationType = (uint8_t)suballocationType;</div> +<div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>  m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div> +<div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>  m_DedicatedAllocation.m_hMemory = hMemory;</div> +<div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>  m_DedicatedAllocation.m_pMappedData = pMappedData;</div> +<div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>  m_DedicatedAllocation.m_Prev = VMA_NULL;</div> +<div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>  m_DedicatedAllocation.m_Next = VMA_NULL;</div> +<div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>  }</div> +<div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>  </div> +<div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>  ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div> +<div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>  VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div> +<div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>  VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div> +<div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>  <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags & FLAG_USER_DATA_STRING) != 0; }</div> +<div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>  <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div> +<div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>  <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div> +<div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>  VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div> <div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>  </div> -<div class="line"><a name="l06497"></a><span class="lineno"> 6497</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div> -<div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div> -<div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>  </div> -<div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>  uint32_t m_FreeCount;</div> -<div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>  VkDeviceSize m_SumFreeSize;</div> -<div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>  VmaSuballocationList m_Suballocations;</div> -<div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>  <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div> -<div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>  <span class="comment">// Sorted by size, ascending.</span></div> -<div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>  VmaVector< VmaSuballocationList::iterator, VmaStlAllocator< VmaSuballocationList::iterator > > m_FreeSuballocationsBySize;</div> -<div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>  </div> -<div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>  <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>  </div> -<div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>  <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div> -<div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>  <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div> -<div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>  <span class="keywordtype">bool</span> CheckAllocation(</div> -<div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>  VmaSuballocationList::const_iterator suballocItem,</div> -<div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>  VkDeviceSize* pOffset,</div> -<div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>  <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div> -<div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>  VkDeviceSize* pSumFreeSize,</div> -<div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>  VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>  <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div> -<div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>  <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div> -<div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>  <span class="comment">// Releases given suballocation, making it free.</span></div> -<div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>  <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div> -<div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>  <span class="comment">// Returns iterator to new free suballocation at this place.</span></div> -<div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>  VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div> -<div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>  <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div> -<div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>  <span class="comment">// m_FreeSuballocationsBySize if it's suitable.</span></div> -<div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>  <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div> -<div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>  <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div> -<div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>  <span class="comment">// m_FreeSuballocationsBySize if it's suitable.</span></div> -<div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>  <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div> -<div class="line"><a name="l06537"></a><span class="lineno"> 6537</span> };</div> -<div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>  </div> -<div class="line"><a name="l06539"></a><span class="lineno"> 6539</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06540"></a><span class="lineno"> 6540</span> <span class="comment">Allocations and their references in internal data structure look like this:</span></div> -<div class="line"><a name="l06541"></a><span class="lineno"> 6541</span> <span class="comment"></span> </div> -<div class="line"><a name="l06542"></a><span class="lineno"> 6542</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div> -<div class="line"><a name="l06543"></a><span class="lineno"> 6543</span> <span class="comment"></span> </div> -<div class="line"><a name="l06544"></a><span class="lineno"> 6544</span> <span class="comment"> 0 +-------+</span></div> -<div class="line"><a name="l06545"></a><span class="lineno"> 6545</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06546"></a><span class="lineno"> 6546</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06547"></a><span class="lineno"> 6547</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06548"></a><span class="lineno"> 6548</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06549"></a><span class="lineno"> 6549</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> -<div class="line"><a name="l06550"></a><span class="lineno"> 6550</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06551"></a><span class="lineno"> 6551</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> -<div class="line"><a name="l06552"></a><span class="lineno"> 6552</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06553"></a><span class="lineno"> 6553</span> <span class="comment"> | ... |</span></div> -<div class="line"><a name="l06554"></a><span class="lineno"> 6554</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06555"></a><span class="lineno"> 6555</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> -<div class="line"><a name="l06556"></a><span class="lineno"> 6556</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06557"></a><span class="lineno"> 6557</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06558"></a><span class="lineno"> 6558</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06559"></a><span class="lineno"> 6559</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06560"></a><span class="lineno"> 6560</span> <span class="comment">GetSize() +-------+</span></div> -<div class="line"><a name="l06561"></a><span class="lineno"> 6561</span> <span class="comment"></span> </div> -<div class="line"><a name="l06562"></a><span class="lineno"> 6562</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div> -<div class="line"><a name="l06563"></a><span class="lineno"> 6563</span> <span class="comment"></span> </div> -<div class="line"><a name="l06564"></a><span class="lineno"> 6564</span> <span class="comment"> 0 +-------+</span></div> -<div class="line"><a name="l06565"></a><span class="lineno"> 6565</span> <span class="comment"> | Alloc | 2nd[0]</span></div> -<div class="line"><a name="l06566"></a><span class="lineno"> 6566</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06567"></a><span class="lineno"> 6567</span> <span class="comment"> | Alloc | 2nd[1]</span></div> -<div class="line"><a name="l06568"></a><span class="lineno"> 6568</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06569"></a><span class="lineno"> 6569</span> <span class="comment"> | ... |</span></div> -<div class="line"><a name="l06570"></a><span class="lineno"> 6570</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06571"></a><span class="lineno"> 6571</span> <span class="comment"> | Alloc | 2nd[2nd.size() - 1]</span></div> -<div class="line"><a name="l06572"></a><span class="lineno"> 6572</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06573"></a><span class="lineno"> 6573</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06574"></a><span class="lineno"> 6574</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06575"></a><span class="lineno"> 6575</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06576"></a><span class="lineno"> 6576</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06577"></a><span class="lineno"> 6577</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> -<div class="line"><a name="l06578"></a><span class="lineno"> 6578</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06579"></a><span class="lineno"> 6579</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> -<div class="line"><a name="l06580"></a><span class="lineno"> 6580</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06581"></a><span class="lineno"> 6581</span> <span class="comment"> | ... |</span></div> -<div class="line"><a name="l06582"></a><span class="lineno"> 6582</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06583"></a><span class="lineno"> 6583</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> -<div class="line"><a name="l06584"></a><span class="lineno"> 6584</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06585"></a><span class="lineno"> 6585</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06586"></a><span class="lineno"> 6586</span> <span class="comment">GetSize() +-------+</span></div> -<div class="line"><a name="l06587"></a><span class="lineno"> 6587</span> <span class="comment"></span> </div> -<div class="line"><a name="l06588"></a><span class="lineno"> 6588</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div> -<div class="line"><a name="l06589"></a><span class="lineno"> 6589</span> <span class="comment"></span> </div> -<div class="line"><a name="l06590"></a><span class="lineno"> 6590</span> <span class="comment"> 0 +-------+</span></div> -<div class="line"><a name="l06591"></a><span class="lineno"> 6591</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06592"></a><span class="lineno"> 6592</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06593"></a><span class="lineno"> 6593</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06594"></a><span class="lineno"> 6594</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06595"></a><span class="lineno"> 6595</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> -<div class="line"><a name="l06596"></a><span class="lineno"> 6596</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06597"></a><span class="lineno"> 6597</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> -<div class="line"><a name="l06598"></a><span class="lineno"> 6598</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06599"></a><span class="lineno"> 6599</span> <span class="comment"> | ... |</span></div> -<div class="line"><a name="l06600"></a><span class="lineno"> 6600</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06601"></a><span class="lineno"> 6601</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> -<div class="line"><a name="l06602"></a><span class="lineno"> 6602</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06603"></a><span class="lineno"> 6603</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06604"></a><span class="lineno"> 6604</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06605"></a><span class="lineno"> 6605</span> <span class="comment"> | |</span></div> -<div class="line"><a name="l06606"></a><span class="lineno"> 6606</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06607"></a><span class="lineno"> 6607</span> <span class="comment"> | Alloc | 2nd[2nd.size() - 1]</span></div> -<div class="line"><a name="l06608"></a><span class="lineno"> 6608</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06609"></a><span class="lineno"> 6609</span> <span class="comment"> | ... |</span></div> -<div class="line"><a name="l06610"></a><span class="lineno"> 6610</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06611"></a><span class="lineno"> 6611</span> <span class="comment"> | Alloc | 2nd[1]</span></div> -<div class="line"><a name="l06612"></a><span class="lineno"> 6612</span> <span class="comment"> +-------+</span></div> -<div class="line"><a name="l06613"></a><span class="lineno"> 6613</span> <span class="comment"> | Alloc | 2nd[0]</span></div> -<div class="line"><a name="l06614"></a><span class="lineno"> 6614</span> <span class="comment">GetSize() +-------+</span></div> -<div class="line"><a name="l06615"></a><span class="lineno"> 6615</span> <span class="comment"></span> </div> -<div class="line"><a name="l06616"></a><span class="lineno"> 6616</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06617"></a><span class="lineno"> 6617</span> <span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div> -<div class="line"><a name="l06618"></a><span class="lineno"> 6618</span> {</div> -<div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div> -<div class="line"><a name="l06620"></a><span class="lineno"> 6620</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>  VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div> -<div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> -<div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>  </div> -<div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div> -<div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</div> -<div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>  </div> -<div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>  </div> -<div class="line"><a name="l06634"></a><span class="lineno"> 6634</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06636"></a><span class="lineno"> 6636</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>  </div> -<div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> -<div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>  uint32_t strategy,</div> -<div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>  </div> -<div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>  </div> -<div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> -<div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>  </div> -<div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div> -<div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>  </div> -<div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> -<div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>  </div> -<div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div> -<div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>  </div> -<div class="line"><a name="l06668"></a><span class="lineno"> 6668</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06670"></a><span class="lineno"> 6670</span> <span class="comment"> There are two suballocation vectors, used in ping-pong way.</span></div> -<div class="line"><a name="l06671"></a><span class="lineno"> 6671</span> <span class="comment"> The one with index m_1stVectorIndex is called 1st.</span></div> -<div class="line"><a name="l06672"></a><span class="lineno"> 6672</span> <span class="comment"> The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div> -<div class="line"><a name="l06673"></a><span class="lineno"> 6673</span> <span class="comment"> 2nd can be non-empty only when 1st is not empty.</span></div> -<div class="line"><a name="l06674"></a><span class="lineno"> 6674</span> <span class="comment"> When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div> -<div class="line"><a name="l06675"></a><span class="lineno"> 6675</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>  <span class="keyword">typedef</span> VmaVector< VmaSuballocation, VmaStlAllocator<VmaSuballocation> > SuballocationVectorType;</div> -<div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>  </div> -<div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>  <span class="keyword">enum</span> SECOND_VECTOR_MODE</div> -<div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>  {</div> -<div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>  SECOND_VECTOR_EMPTY,</div> -<div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06682"></a><span class="lineno"> 6682</span> <span class="comment"> Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div> -<div class="line"><a name="l06683"></a><span class="lineno"> 6683</span> <span class="comment"> all have smaller offset.</span></div> -<div class="line"><a name="l06684"></a><span class="lineno"> 6684</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>  SECOND_VECTOR_RING_BUFFER,</div> -<div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06687"></a><span class="lineno"> 6687</span> <span class="comment"> Suballocations in 2nd vector are upper side of double stack.</span></div> -<div class="line"><a name="l06688"></a><span class="lineno"> 6688</span> <span class="comment"> They all have offsets higher than those in 1st vector.</span></div> -<div class="line"><a name="l06689"></a><span class="lineno"> 6689</span> <span class="comment"> Top of this stack means smaller offsets, but higher indices in this vector.</span></div> -<div class="line"><a name="l06690"></a><span class="lineno"> 6690</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>  SECOND_VECTOR_DOUBLE_STACK,</div> -<div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>  };</div> -<div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>  </div> -<div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>  VkDeviceSize m_SumFreeSize;</div> -<div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>  SuballocationVectorType m_Suballocations0, m_Suballocations1;</div> -<div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>  uint32_t m_1stVectorIndex;</div> -<div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>  SECOND_VECTOR_MODE m_2ndVectorMode;</div> -<div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>  </div> -<div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>  SuballocationVectorType& AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div> -<div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>  SuballocationVectorType& AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div> -<div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>  <span class="keyword">const</span> SuballocationVectorType& AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div> -<div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>  <span class="keyword">const</span> SuballocationVectorType& AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div> -<div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>  </div> -<div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>  <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div> -<div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>  <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>  <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div> -<div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>  <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>  <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div> -<div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>  <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div> -<div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>  </div> -<div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>  <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>  <span class="keywordtype">void</span> CleanupAfterFree();</div> -<div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>  </div> -<div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>  <span class="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div> -<div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>  uint32_t strategy,</div> -<div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>  <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div> -<div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>  uint32_t strategy,</div> -<div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06734"></a><span class="lineno"> 6734</span> };</div> -<div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>  </div> -<div class="line"><a name="l06736"></a><span class="lineno"> 6736</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06737"></a><span class="lineno"> 6737</span> <span class="comment">- GetSize() is the original size of allocated memory block.</span></div> -<div class="line"><a name="l06738"></a><span class="lineno"> 6738</span> <span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div> -<div class="line"><a name="l06739"></a><span class="lineno"> 6739</span> <span class="comment"> All allocations and calculations happen relative to m_UsableSize.</span></div> -<div class="line"><a name="l06740"></a><span class="lineno"> 6740</span> <span class="comment">- GetUnusableSize() is the difference between them.</span></div> -<div class="line"><a name="l06741"></a><span class="lineno"> 6741</span> <span class="comment"> It is repoted as separate, unused range, not available for allocations.</span></div> -<div class="line"><a name="l06742"></a><span class="lineno"> 6742</span> <span class="comment"></span> </div> -<div class="line"><a name="l06743"></a><span class="lineno"> 6743</span> <span class="comment">Node at level 0 has size = m_UsableSize.</span></div> -<div class="line"><a name="l06744"></a><span class="lineno"> 6744</span> <span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div> -<div class="line"><a name="l06745"></a><span class="lineno"> 6745</span> <span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div> -<div class="line"><a name="l06746"></a><span class="lineno"> 6746</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06747"></a><span class="lineno"> 6747</span> <span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div> -<div class="line"><a name="l06748"></a><span class="lineno"> 6748</span> {</div> -<div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div> -<div class="line"><a name="l06750"></a><span class="lineno"> 6750</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>  VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div> -<div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> -<div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>  </div> -<div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div> -<div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div> -<div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root->type == Node::TYPE_FREE; }</div> +<div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>  VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div> +<div class="line"><a name="l06498"></a><span class="lineno"> 6498</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> +<div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div> +<div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>  }</div> +<div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>  VkDeviceSize GetOffset() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>  VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> +<div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>  <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount & MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div> +<div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>  <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>  <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>  </div> +<div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>  uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div> +<div class="line"><a name="l06510"></a><span class="lineno"> 6510</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>  <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div> +<div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>  }</div> +<div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>  <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t& expected, uint32_t desired)</div> +<div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>  {</div> +<div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>  <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div> +<div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>  }</div> +<div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l06518"></a><span class="lineno"> 6518</span> <span class="comment"> - If hAllocation.LastUseFrameIndex + frameInUseCount < allocator.CurrentFrameIndex,</span></div> +<div class="line"><a name="l06519"></a><span class="lineno"> 6519</span> <span class="comment"> makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div> +<div class="line"><a name="l06520"></a><span class="lineno"> 6520</span> <span class="comment"> - Else, returns false.</span></div> +<div class="line"><a name="l06521"></a><span class="lineno"> 6521</span> <span class="comment"></span> </div> +<div class="line"><a name="l06522"></a><span class="lineno"> 6522</span> <span class="comment"> If hAllocation is already lost, assert - you should not call it then.</span></div> +<div class="line"><a name="l06523"></a><span class="lineno"> 6523</span> <span class="comment"> If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div> +<div class="line"><a name="l06524"></a><span class="lineno"> 6524</span> <span class="comment"> */</span></div> +<div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>  <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> +<div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>  </div> +<div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>  <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)</div> +<div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>  {</div> +<div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> +<div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div> +<div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> +<div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div> +<div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div> +<div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div> +<div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> +<div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>  }</div> +<div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>  </div> +<div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>  <span class="keywordtype">void</span> BlockAllocMap();</div> +<div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>  <span class="keywordtype">void</span> BlockAllocUnmap();</div> +<div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>  VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div> +<div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>  <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>  </div> +<div class="line"><a name="l06545"></a><span class="lineno"> 6545</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>  uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div> +<div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>  uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div> +<div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>  </div> +<div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>  <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div> +<div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>  {</div> +<div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>  VMA_ASSERT(m_BufferImageUsage == 0);</div> +<div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>  m_BufferImageUsage = bufferImageUsage;</div> +<div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>  }</div> +<div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>  </div> +<div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>  <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06556"></a><span class="lineno"> 6556</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>  </div> +<div class="line"><a name="l06558"></a><span class="lineno"> 6558</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>  VkDeviceSize m_Alignment;</div> +<div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>  VkDeviceSize m_Size;</div> +<div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>  <span class="keywordtype">void</span>* m_pUserData;</div> +<div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>  VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div> +<div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>  uint32_t m_MemoryTypeIndex;</div> +<div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>  uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div> +<div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>  uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div> +<div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>  <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div> +<div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>  <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div> +<div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>  uint8_t m_MapCount;</div> +<div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>  uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div> +<div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>  </div> +<div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>  <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div> +<div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>  <span class="keyword">struct </span>BlockAllocation</div> +<div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>  {</div> +<div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>  VmaDeviceMemoryBlock* m_Block;</div> +<div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>  VkDeviceSize m_Offset;</div> +<div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>  <span class="keywordtype">bool</span> m_CanBecomeLost;</div> +<div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>  };</div> +<div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>  </div> +<div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>  <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div> +<div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>  <span class="keyword">struct </span>DedicatedAllocation</div> +<div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>  {</div> +<div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>  VkDeviceMemory m_hMemory;</div> +<div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>  <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div> +<div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>  VmaAllocation_T* m_Prev;</div> +<div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>  VmaAllocation_T* m_Next;</div> +<div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>  };</div> +<div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>  </div> +<div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>  <span class="keyword">union</span></div> +<div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>  {</div> +<div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>  <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div> +<div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>  BlockAllocation m_BlockAllocation;</div> +<div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>  <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div> +<div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>  DedicatedAllocation m_DedicatedAllocation;</div> +<div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>  };</div> +<div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>  </div> +<div class="line"><a name="l06596"></a><span class="lineno"> 6596</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>  uint32_t m_CreationFrameIndex;</div> +<div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>  uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div> +<div class="line"><a name="l06599"></a><span class="lineno"> 6599</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>  </div> +<div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>  <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>  </div> +<div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>  <span class="keyword">friend</span> <span class="keyword">struct </span>VmaDedicatedAllocationListItemTraits;</div> +<div class="line"><a name="l06604"></a><span class="lineno"> 6604</span> };</div> +<div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>  </div> +<div class="line"><a name="l06606"></a><span class="lineno"> 6606</span> <span class="keyword">struct </span>VmaDedicatedAllocationListItemTraits</div> +<div class="line"><a name="l06607"></a><span class="lineno"> 6607</span> {</div> +<div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>  <span class="keyword">typedef</span> VmaAllocation_T ItemType;</div> +<div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>  <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item)</div> +<div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>  {</div> +<div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>  VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>  <span class="keywordflow">return</span> item->m_DedicatedAllocation.m_Prev;</div> +<div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>  }</div> +<div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>  <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item)</div> +<div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>  {</div> +<div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>  VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>  <span class="keywordflow">return</span> item->m_DedicatedAllocation.m_Next;</div> +<div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>  }</div> +<div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>  <span class="keyword">static</span> ItemType*& AccessPrev(ItemType* item)</div> +<div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>  {</div> +<div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>  VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>  <span class="keywordflow">return</span> item->m_DedicatedAllocation.m_Prev;</div> +<div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>  }</div> +<div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>  <span class="keyword">static</span> ItemType*& AccessNext(ItemType* item){</div> +<div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>  VMA_HEAVY_ASSERT(item->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>  <span class="keywordflow">return</span> item->m_DedicatedAllocation.m_Next;</div> +<div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>  }</div> +<div class="line"><a name="l06628"></a><span class="lineno"> 6628</span> };</div> +<div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>  </div> +<div class="line"><a name="l06630"></a><span class="lineno"> 6630</span> <span class="comment">/*</span></div> +<div class="line"><a name="l06631"></a><span class="lineno"> 6631</span> <span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div> +<div class="line"><a name="l06632"></a><span class="lineno"> 6632</span> <span class="comment">allocated memory block or free.</span></div> +<div class="line"><a name="l06633"></a><span class="lineno"> 6633</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06634"></a><span class="lineno"> 6634</span> <span class="keyword">struct </span>VmaSuballocation</div> +<div class="line"><a name="l06635"></a><span class="lineno"> 6635</span> {</div> +<div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>  VkDeviceSize offset;</div> +<div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>  VkDeviceSize size;</div> +<div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div> +<div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>  VmaSuballocationType type;</div> +<div class="line"><a name="l06640"></a><span class="lineno"> 6640</span> };</div> +<div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>  </div> +<div class="line"><a name="l06642"></a><span class="lineno"> 6642</span> <span class="comment">// Comparator for offsets.</span></div> +<div class="line"><a name="l06643"></a><span class="lineno"> 6643</span> <span class="keyword">struct </span>VmaSuballocationOffsetLess</div> +<div class="line"><a name="l06644"></a><span class="lineno"> 6644</span> {</div> +<div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation& lhs, <span class="keyword">const</span> VmaSuballocation& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l06646"></a><span class="lineno"> 6646</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>  <span class="keywordflow">return</span> lhs.offset < rhs.offset;</div> +<div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>  }</div> +<div class="line"><a name="l06649"></a><span class="lineno"> 6649</span> };</div> +<div class="line"><a name="l06650"></a><span class="lineno"> 6650</span> <span class="keyword">struct </span>VmaSuballocationOffsetGreater</div> +<div class="line"><a name="l06651"></a><span class="lineno"> 6651</span> {</div> +<div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation& lhs, <span class="keyword">const</span> VmaSuballocation& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l06653"></a><span class="lineno"> 6653</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>  <span class="keywordflow">return</span> lhs.offset > rhs.offset;</div> +<div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>  }</div> +<div class="line"><a name="l06656"></a><span class="lineno"> 6656</span> };</div> +<div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>  </div> +<div class="line"><a name="l06658"></a><span class="lineno"> 6658</span> <span class="keyword">typedef</span> VmaList< VmaSuballocation, VmaStlAllocator<VmaSuballocation> > VmaSuballocationList;</div> +<div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>  </div> +<div class="line"><a name="l06660"></a><span class="lineno"> 6660</span> <span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div> +<div class="line"><a name="l06661"></a><span class="lineno"> 6661</span> <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div> +<div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>  </div> +<div class="line"><a name="l06663"></a><span class="lineno"> 6663</span> <span class="keyword">enum class</span> VmaAllocationRequestType</div> +<div class="line"><a name="l06664"></a><span class="lineno"> 6664</span> {</div> +<div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>  Normal,</div> +<div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>  <span class="comment">// Used by "Linear" algorithm.</span></div> +<div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>  UpperAddress,</div> +<div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>  EndOf1st,</div> +<div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>  EndOf2nd,</div> +<div class="line"><a name="l06670"></a><span class="lineno"> 6670</span> };</div> +<div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>  </div> +<div class="line"><a name="l06672"></a><span class="lineno"> 6672</span> <span class="comment">/*</span></div> +<div class="line"><a name="l06673"></a><span class="lineno"> 6673</span> <span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div> +<div class="line"><a name="l06674"></a><span class="lineno"> 6674</span> <span class="comment"></span> </div> +<div class="line"><a name="l06675"></a><span class="lineno"> 6675</span> <span class="comment">If canMakeOtherLost was false:</span></div> +<div class="line"><a name="l06676"></a><span class="lineno"> 6676</span> <span class="comment">- item points to a FREE suballocation.</span></div> +<div class="line"><a name="l06677"></a><span class="lineno"> 6677</span> <span class="comment">- itemsToMakeLostCount is 0.</span></div> +<div class="line"><a name="l06678"></a><span class="lineno"> 6678</span> <span class="comment"></span> </div> +<div class="line"><a name="l06679"></a><span class="lineno"> 6679</span> <span class="comment">If canMakeOtherLost was true:</span></div> +<div class="line"><a name="l06680"></a><span class="lineno"> 6680</span> <span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div> +<div class="line"><a name="l06681"></a><span class="lineno"> 6681</span> <span class="comment"> or point to VmaAllocations that can become lost.</span></div> +<div class="line"><a name="l06682"></a><span class="lineno"> 6682</span> <span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div> +<div class="line"><a name="l06683"></a><span class="lineno"> 6683</span> <span class="comment"> the requested allocation to succeed.</span></div> +<div class="line"><a name="l06684"></a><span class="lineno"> 6684</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06685"></a><span class="lineno"> 6685</span> <span class="keyword">struct </span>VmaAllocationRequest</div> +<div class="line"><a name="l06686"></a><span class="lineno"> 6686</span> {</div> +<div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>  VkDeviceSize offset;</div> +<div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>  VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div> +<div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>  VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div> +<div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>  VmaSuballocationList::iterator item;</div> +<div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>  <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div> +<div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>  <span class="keywordtype">void</span>* customData;</div> +<div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>  VmaAllocationRequestType type;</div> +<div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>  </div> +<div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>  VkDeviceSize CalcCost()<span class="keyword"> const</span></div> +<div class="line"><a name="l06696"></a><span class="lineno"> 6696</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>  <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div> +<div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>  }</div> +<div class="line"><a name="l06699"></a><span class="lineno"> 6699</span> };</div> +<div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>  </div> +<div class="line"><a name="l06701"></a><span class="lineno"> 6701</span> <span class="comment">/*</span></div> +<div class="line"><a name="l06702"></a><span class="lineno"> 6702</span> <span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div> +<div class="line"><a name="l06703"></a><span class="lineno"> 6703</span> <span class="comment">in a single VkDeviceMemory block.</span></div> +<div class="line"><a name="l06704"></a><span class="lineno"> 6704</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06705"></a><span class="lineno"> 6705</span> <span class="keyword">class </span>VmaBlockMetadata</div> +<div class="line"><a name="l06706"></a><span class="lineno"> 6706</span> {</div> +<div class="line"><a name="l06707"></a><span class="lineno"> 6707</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>  VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div> +<div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</div> +<div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>  </div> +<div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>  <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div> +<div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>  VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div> +<div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>  <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div> +<div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>  </div> +<div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>  <span class="comment">// Shouldn't modify blockCount.</span></div> +<div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>  </div> +<div class="line"><a name="l06725"></a><span class="lineno"> 6725</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l06727"></a><span class="lineno"> 6727</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>  </div> +<div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>  <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div> +<div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>  <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div> +<div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>  <span class="comment">// If failed, returns false.</span></div> +<div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> +<div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>  <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* or VMA_ALLOCATION_INTERNAL_STRATEGY_* flags.</span></div> +<div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>  uint32_t strategy,</div> +<div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>  VmaAllocationRequest* pAllocationRequest) = 0;</div> +<div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>  </div> +<div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>  VmaAllocationRequest* pAllocationRequest) = 0;</div> +<div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>  </div> +<div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</div> +<div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>  </div> +<div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div> +<div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>  </div> +<div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>  <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div> +<div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> +<div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div> <div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>  </div> -<div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>  </div> -<div class="line"><a name="l06764"></a><span class="lineno"> 6764</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06766"></a><span class="lineno"> 6766</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>  <span class="comment">// Frees suballocation assigned to given memory region.</span></div> +<div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div> +<div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div> +<div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>  </div> +<div class="line"><a name="l06765"></a><span class="lineno"> 6765</span> <span class="keyword">protected</span>:</div> +<div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>  <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</div> <div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>  </div> -<div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> -<div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>  uint32_t strategy,</div> -<div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>  </div> -<div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>  VmaAllocationRequest* pAllocationRequest);</div> -<div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>  </div> -<div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> +<div class="line"><a name="l06768"></a><span class="lineno"> 6768</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>  <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>  VkDeviceSize unusedBytes,</div> +<div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>  <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>  <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>  <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>  VkDeviceSize size) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>  <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06780"></a><span class="lineno"> 6780</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>  </div> +<div class="line"><a name="l06782"></a><span class="lineno"> 6782</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>  VkDeviceSize m_Size;</div> +<div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>  <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div> +<div class="line"><a name="l06785"></a><span class="lineno"> 6785</span> };</div> <div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>  </div> -<div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div> -<div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>  </div> -<div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> -<div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>  </div> -<div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation->GetOffset()); }</div> -<div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</div> -<div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>  </div> -<div class="line"><a name="l06798"></a><span class="lineno"> 6798</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>  <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div> -<div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</div> -<div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>  </div> -<div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>  <span class="keyword">struct </span>ValidationContext</div> -<div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>  {</div> -<div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>  <span class="keywordtype">size_t</span> calculatedAllocationCount;</div> -<div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>  <span class="keywordtype">size_t</span> calculatedFreeCount;</div> -<div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>  VkDeviceSize calculatedSumFreeSize;</div> -<div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>  </div> -<div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>  ValidationContext() :</div> -<div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>  calculatedAllocationCount(0),</div> -<div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>  calculatedFreeCount(0),</div> -<div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>  calculatedSumFreeSize(0) { }</div> -<div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>  };</div> -<div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>  </div> -<div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>  <span class="keyword">struct </span>Node</div> -<div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>  {</div> -<div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>  VkDeviceSize offset;</div> -<div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>  <span class="keyword">enum</span> TYPE</div> -<div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>  {</div> -<div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>  TYPE_FREE,</div> -<div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>  TYPE_ALLOCATION,</div> -<div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>  TYPE_SPLIT,</div> -<div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>  TYPE_COUNT</div> -<div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>  } type;</div> -<div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>  Node* parent;</div> -<div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>  Node* buddy;</div> -<div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>  </div> -<div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>  <span class="keyword">union</span></div> -<div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>  {</div> -<div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>  <span class="keyword">struct</span></div> -<div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>  {</div> -<div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>  Node* prev;</div> -<div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>  Node* next;</div> -<div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>  } free;</div> -<div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>  <span class="keyword">struct</span></div> -<div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>  {</div> -<div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div> -<div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>  } allocation;</div> -<div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>  <span class="keyword">struct</span></div> -<div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>  {</div> -<div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>  Node* leftChild;</div> -<div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>  } split;</div> -<div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>  };</div> -<div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>  };</div> -<div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>  </div> -<div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>  <span class="comment">// Size of the memory block aligned down to a power of two.</span></div> -<div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>  VkDeviceSize m_UsableSize;</div> -<div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>  uint32_t m_LevelCount;</div> -<div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>  </div> -<div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>  Node* m_Root;</div> -<div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>  <span class="keyword">struct </span>{</div> -<div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>  Node* front;</div> -<div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>  Node* back;</div> -<div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>  } m_FreeList[MAX_LEVELS];</div> -<div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>  <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div> -<div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>  <span class="keywordtype">size_t</span> m_AllocationCount;</div> -<div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>  <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div> -<div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>  <span class="keywordtype">size_t</span> m_FreeCount;</div> -<div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>  <span class="comment">// This includes space wasted due to internal fragmentation. Doesn't include unusable size.</span></div> -<div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>  VkDeviceSize m_SumFreeSize;</div> +<div class="line"><a name="l06787"></a><span class="lineno"> 6787</span> <span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div> +<div class="line"><a name="l06788"></a><span class="lineno"> 6788</span> <span class="preprocessor"> VMA_ASSERT(0 && "Validation failed: "</span> #cond); \</div> +<div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>  return false; \</div> +<div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>  } } while(false)</div> +<div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>  </div> +<div class="line"><a name="l06792"></a><span class="lineno"> 6792</span> <span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</div> +<div class="line"><a name="l06793"></a><span class="lineno"> 6793</span> {</div> +<div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div> +<div class="line"><a name="l06795"></a><span class="lineno"> 6795</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>  VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div> +<div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> +<div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>  </div> +<div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div> +<div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div> +<div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>  </div> +<div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>  </div> +<div class="line"><a name="l06809"></a><span class="lineno"> 6809</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06811"></a><span class="lineno"> 6811</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>  </div> +<div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> +<div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>  uint32_t strategy,</div> +<div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>  </div> +<div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>  </div> +<div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> +<div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>  </div> +<div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div> +<div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>  </div> +<div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> +<div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> +<div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>  </div> +<div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div> +<div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>  </div> +<div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>  <span class="comment">// For defragmentation</span></div> +<div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>  </div> +<div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>  <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible(</div> +<div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>  VmaSuballocationType& inOutPrevSuballocType) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>  </div> +<div class="line"><a name="l06850"></a><span class="lineno"> 6850</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div> +<div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast;</div> +<div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>  </div> +<div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>  uint32_t m_FreeCount;</div> +<div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>  VkDeviceSize m_SumFreeSize;</div> +<div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>  VmaSuballocationList m_Suballocations;</div> +<div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>  <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div> +<div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>  <span class="comment">// Sorted by size, ascending.</span></div> +<div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>  VmaVector< VmaSuballocationList::iterator, VmaStlAllocator< VmaSuballocationList::iterator > > m_FreeSuballocationsBySize;</div> <div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>  </div> -<div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>  VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div> -<div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>  <span class="keywordtype">void</span> DeleteNode(Node* node);</div> -<div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>  <span class="keywordtype">bool</span> ValidateNode(ValidationContext& ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>  uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>  <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize >> level; }</div> -<div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>  <span class="comment">// Alloc passed just for validation. Can be null.</span></div> -<div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>  <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div> -<div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>  <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>  <span class="comment">// Adds node to the front of FreeList at given level.</span></div> -<div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>  <span class="comment">// node->type must be FREE.</span></div> -<div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>  <span class="comment">// node->free.prev, next can be undefined.</span></div> -<div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>  <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div> -<div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>  <span class="comment">// Removes node from FreeList at given level.</span></div> -<div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>  <span class="comment">// node->type must be FREE.</span></div> -<div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>  <span class="comment">// node->free.prev, next stay untouched.</span></div> -<div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>  <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</div> -<div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>  </div> -<div class="line"><a name="l06878"></a><span class="lineno"> 6878</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>  <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter& json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> -<div class="line"><a name="l06880"></a><span class="lineno"> 6880</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l06881"></a><span class="lineno"> 6881</span> };</div> -<div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>  </div> -<div class="line"><a name="l06883"></a><span class="lineno"> 6883</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06884"></a><span class="lineno"> 6884</span> <span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div> -<div class="line"><a name="l06885"></a><span class="lineno"> 6885</span> <span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div> -<div class="line"><a name="l06886"></a><span class="lineno"> 6886</span> <span class="comment"></span> </div> -<div class="line"><a name="l06887"></a><span class="lineno"> 6887</span> <span class="comment">Thread-safety: This class must be externally synchronized.</span></div> -<div class="line"><a name="l06888"></a><span class="lineno"> 6888</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06889"></a><span class="lineno"> 6889</span> <span class="keyword">class </span>VmaDeviceMemoryBlock</div> -<div class="line"><a name="l06890"></a><span class="lineno"> 6890</span> {</div> -<div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>  VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div> -<div class="line"><a name="l06892"></a><span class="lineno"> 6892</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>  VmaBlockMetadata* m_pMetadata;</div> -<div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>  </div> -<div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>  VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>  </div> -<div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>  ~VmaDeviceMemoryBlock()</div> -<div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>  {</div> -<div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>  VMA_ASSERT(m_MapCount == 0 && <span class="stringliteral">"VkDeviceMemory block is being destroyed while it is still mapped."</span>);</div> -<div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>  VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div> -<div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>  }</div> -<div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>  </div> -<div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>  <span class="comment">// Always call after construction.</span></div> -<div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>  <span class="keywordtype">void</span> Init(</div> -<div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> -<div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>  uint32_t newMemoryTypeIndex,</div> -<div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>  VkDeviceMemory newMemory,</div> -<div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>  VkDeviceSize newSize,</div> -<div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>  uint32_t <span class="keywordtype">id</span>,</div> -<div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>  uint32_t algorithm);</div> -<div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>  <span class="comment">// Always call before destruction.</span></div> -<div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>  <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div> -<div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>  </div> -<div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div> -<div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>  VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div> -<div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> -<div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>  uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div> -<div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>  <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div> -<div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>  </div> -<div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>  <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div> -<div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>  <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> -<div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>  </div> -<div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>  VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> -<div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>  </div> -<div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>  <span class="comment">// ppData can be null.</span></div> -<div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>  VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div> -<div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>  <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div> -<div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>  </div> -<div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>  VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div> -<div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>  VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div> -<div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>  </div> -<div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>  VkResult BindBufferMemory(</div> -<div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>  VkBuffer hBuffer,</div> -<div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>  VkResult BindImageMemory(</div> -<div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>  VkImage hImage,</div> -<div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>  </div> -<div class="line"><a name="l06946"></a><span class="lineno"> 6946</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div> -<div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>  uint32_t m_MemoryTypeIndex;</div> -<div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>  uint32_t m_Id;</div> -<div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>  VkDeviceMemory m_hMemory;</div> -<div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>  </div> -<div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l06953"></a><span class="lineno"> 6953</span> <span class="comment"> Protects access to m_hMemory so it's not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div> -<div class="line"><a name="l06954"></a><span class="lineno"> 6954</span> <span class="comment"> Also protects m_MapCount, m_pMappedData.</span></div> -<div class="line"><a name="l06955"></a><span class="lineno"> 6955</span> <span class="comment"> Allocations, deallocations, any change in m_pMetadata is protected by parent's VmaBlockVector::m_Mutex.</span></div> -<div class="line"><a name="l06956"></a><span class="lineno"> 6956</span> <span class="comment"> */</span></div> -<div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>  VMA_MUTEX m_Mutex;</div> -<div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>  uint32_t m_MapCount;</div> -<div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>  <span class="keywordtype">void</span>* m_pMappedData;</div> -<div class="line"><a name="l06960"></a><span class="lineno"> 6960</span> };</div> -<div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>  </div> -<div class="line"><a name="l06962"></a><span class="lineno"> 6962</span> <span class="keyword">struct </span>VmaPointerLess</div> -<div class="line"><a name="l06963"></a><span class="lineno"> 6963</span> {</div> -<div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <span class="keywordtype">void</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">void</span>* rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l06965"></a><span class="lineno"> 6965</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>  <span class="keywordflow">return</span> lhs < rhs;</div> -<div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>  }</div> -<div class="line"><a name="l06968"></a><span class="lineno"> 6968</span> };</div> -<div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>  </div> -<div class="line"><a name="l06970"></a><span class="lineno"> 6970</span> <span class="keyword">struct </span>VmaDefragmentationMove</div> +<div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>  <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>  </div> +<div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>  <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div> +<div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>  <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div> +<div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>  <span class="keywordtype">bool</span> CheckAllocation(</div> +<div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>  VmaSuballocationList::const_iterator suballocItem,</div> +<div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>  VkDeviceSize* pOffset,</div> +<div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>  <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div> +<div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>  VkDeviceSize* pSumFreeSize,</div> +<div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>  VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>  <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div> +<div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>  <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div> +<div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>  <span class="comment">// Releases given suballocation, making it free.</span></div> +<div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>  <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div> +<div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>  <span class="comment">// Returns iterator to new free suballocation at this place.</span></div> +<div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>  VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div> +<div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>  <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div> +<div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>  <span class="comment">// m_FreeSuballocationsBySize if it's suitable.</span></div> +<div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>  <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div> +<div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>  <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div> +<div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>  <span class="comment">// m_FreeSuballocationsBySize if it's suitable.</span></div> +<div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>  <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div> +<div class="line"><a name="l06890"></a><span class="lineno"> 6890</span> };</div> +<div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>  </div> +<div class="line"><a name="l06892"></a><span class="lineno"> 6892</span> <span class="comment">/*</span></div> +<div class="line"><a name="l06893"></a><span class="lineno"> 6893</span> <span class="comment">Allocations and their references in internal data structure look like this:</span></div> +<div class="line"><a name="l06894"></a><span class="lineno"> 6894</span> <span class="comment"></span> </div> +<div class="line"><a name="l06895"></a><span class="lineno"> 6895</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div> +<div class="line"><a name="l06896"></a><span class="lineno"> 6896</span> <span class="comment"></span> </div> +<div class="line"><a name="l06897"></a><span class="lineno"> 6897</span> <span class="comment"> 0 +-------+</span></div> +<div class="line"><a name="l06898"></a><span class="lineno"> 6898</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06899"></a><span class="lineno"> 6899</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06900"></a><span class="lineno"> 6900</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06901"></a><span class="lineno"> 6901</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06902"></a><span class="lineno"> 6902</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> +<div class="line"><a name="l06903"></a><span class="lineno"> 6903</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06904"></a><span class="lineno"> 6904</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> +<div class="line"><a name="l06905"></a><span class="lineno"> 6905</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06906"></a><span class="lineno"> 6906</span> <span class="comment"> | ... |</span></div> +<div class="line"><a name="l06907"></a><span class="lineno"> 6907</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06908"></a><span class="lineno"> 6908</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> +<div class="line"><a name="l06909"></a><span class="lineno"> 6909</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06910"></a><span class="lineno"> 6910</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06911"></a><span class="lineno"> 6911</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06912"></a><span class="lineno"> 6912</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06913"></a><span class="lineno"> 6913</span> <span class="comment">GetSize() +-------+</span></div> +<div class="line"><a name="l06914"></a><span class="lineno"> 6914</span> <span class="comment"></span> </div> +<div class="line"><a name="l06915"></a><span class="lineno"> 6915</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div> +<div class="line"><a name="l06916"></a><span class="lineno"> 6916</span> <span class="comment"></span> </div> +<div class="line"><a name="l06917"></a><span class="lineno"> 6917</span> <span class="comment"> 0 +-------+</span></div> +<div class="line"><a name="l06918"></a><span class="lineno"> 6918</span> <span class="comment"> | Alloc | 2nd[0]</span></div> +<div class="line"><a name="l06919"></a><span class="lineno"> 6919</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06920"></a><span class="lineno"> 6920</span> <span class="comment"> | Alloc | 2nd[1]</span></div> +<div class="line"><a name="l06921"></a><span class="lineno"> 6921</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06922"></a><span class="lineno"> 6922</span> <span class="comment"> | ... |</span></div> +<div class="line"><a name="l06923"></a><span class="lineno"> 6923</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06924"></a><span class="lineno"> 6924</span> <span class="comment"> | Alloc | 2nd[2nd.size() - 1]</span></div> +<div class="line"><a name="l06925"></a><span class="lineno"> 6925</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06926"></a><span class="lineno"> 6926</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06927"></a><span class="lineno"> 6927</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06928"></a><span class="lineno"> 6928</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06929"></a><span class="lineno"> 6929</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06930"></a><span class="lineno"> 6930</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> +<div class="line"><a name="l06931"></a><span class="lineno"> 6931</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06932"></a><span class="lineno"> 6932</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> +<div class="line"><a name="l06933"></a><span class="lineno"> 6933</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06934"></a><span class="lineno"> 6934</span> <span class="comment"> | ... |</span></div> +<div class="line"><a name="l06935"></a><span class="lineno"> 6935</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06936"></a><span class="lineno"> 6936</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> +<div class="line"><a name="l06937"></a><span class="lineno"> 6937</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06938"></a><span class="lineno"> 6938</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06939"></a><span class="lineno"> 6939</span> <span class="comment">GetSize() +-------+</span></div> +<div class="line"><a name="l06940"></a><span class="lineno"> 6940</span> <span class="comment"></span> </div> +<div class="line"><a name="l06941"></a><span class="lineno"> 6941</span> <span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div> +<div class="line"><a name="l06942"></a><span class="lineno"> 6942</span> <span class="comment"></span> </div> +<div class="line"><a name="l06943"></a><span class="lineno"> 6943</span> <span class="comment"> 0 +-------+</span></div> +<div class="line"><a name="l06944"></a><span class="lineno"> 6944</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06945"></a><span class="lineno"> 6945</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06946"></a><span class="lineno"> 6946</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06947"></a><span class="lineno"> 6947</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06948"></a><span class="lineno"> 6948</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount]</span></div> +<div class="line"><a name="l06949"></a><span class="lineno"> 6949</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06950"></a><span class="lineno"> 6950</span> <span class="comment"> | Alloc | 1st[m_1stNullItemsBeginCount + 1]</span></div> +<div class="line"><a name="l06951"></a><span class="lineno"> 6951</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06952"></a><span class="lineno"> 6952</span> <span class="comment"> | ... |</span></div> +<div class="line"><a name="l06953"></a><span class="lineno"> 6953</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06954"></a><span class="lineno"> 6954</span> <span class="comment"> | Alloc | 1st[1st.size() - 1]</span></div> +<div class="line"><a name="l06955"></a><span class="lineno"> 6955</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06956"></a><span class="lineno"> 6956</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06957"></a><span class="lineno"> 6957</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06958"></a><span class="lineno"> 6958</span> <span class="comment"> | |</span></div> +<div class="line"><a name="l06959"></a><span class="lineno"> 6959</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06960"></a><span class="lineno"> 6960</span> <span class="comment"> | Alloc | 2nd[2nd.size() - 1]</span></div> +<div class="line"><a name="l06961"></a><span class="lineno"> 6961</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06962"></a><span class="lineno"> 6962</span> <span class="comment"> | ... |</span></div> +<div class="line"><a name="l06963"></a><span class="lineno"> 6963</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06964"></a><span class="lineno"> 6964</span> <span class="comment"> | Alloc | 2nd[1]</span></div> +<div class="line"><a name="l06965"></a><span class="lineno"> 6965</span> <span class="comment"> +-------+</span></div> +<div class="line"><a name="l06966"></a><span class="lineno"> 6966</span> <span class="comment"> | Alloc | 2nd[0]</span></div> +<div class="line"><a name="l06967"></a><span class="lineno"> 6967</span> <span class="comment">GetSize() +-------+</span></div> +<div class="line"><a name="l06968"></a><span class="lineno"> 6968</span> <span class="comment"></span> </div> +<div class="line"><a name="l06969"></a><span class="lineno"> 6969</span> <span class="comment">*/</span></div> +<div class="line"><a name="l06970"></a><span class="lineno"> 6970</span> <span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div> <div class="line"><a name="l06971"></a><span class="lineno"> 6971</span> {</div> -<div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>  <span class="keywordtype">size_t</span> srcBlockIndex;</div> -<div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>  <span class="keywordtype">size_t</span> dstBlockIndex;</div> -<div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>  VkDeviceSize srcOffset;</div> -<div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>  VkDeviceSize dstOffset;</div> -<div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>  VkDeviceSize size;</div> -<div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div> -<div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>  VmaDeviceMemoryBlock* pSrcBlock;</div> -<div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>  VmaDeviceMemoryBlock* pDstBlock;</div> -<div class="line"><a name="l06980"></a><span class="lineno"> 6980</span> };</div> -<div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>  </div> -<div class="line"><a name="l06982"></a><span class="lineno"> 6982</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm;</div> +<div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div> +<div class="line"><a name="l06973"></a><span class="lineno"> 6973</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>  VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div> +<div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> +<div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>  </div> +<div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div> +<div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> +<div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</div> <div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>  </div> -<div class="line"><a name="l06984"></a><span class="lineno"> 6984</span> <span class="comment">/*</span></div> -<div class="line"><a name="l06985"></a><span class="lineno"> 6985</span> <span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div> -<div class="line"><a name="l06986"></a><span class="lineno"> 6986</span> <span class="comment">Vulkan memory type.</span></div> -<div class="line"><a name="l06987"></a><span class="lineno"> 6987</span> <span class="comment"></span> </div> -<div class="line"><a name="l06988"></a><span class="lineno"> 6988</span> <span class="comment">Synchronized internally with a mutex.</span></div> -<div class="line"><a name="l06989"></a><span class="lineno"> 6989</span> <span class="comment">*/</span></div> -<div class="line"><a name="l06990"></a><span class="lineno"> 6990</span> <span class="keyword">struct </span>VmaBlockVector</div> -<div class="line"><a name="l06991"></a><span class="lineno"> 6991</span> {</div> -<div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>  VMA_CLASS_NO_COPY(VmaBlockVector)</div> -<div class="line"><a name="l06993"></a><span class="lineno"> 6993</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>  VmaBlockVector(</div> -<div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> -<div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>  uint32_t memoryTypeIndex,</div> -<div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>  VkDeviceSize preferredBlockSize,</div> -<div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>  <span class="keywordtype">size_t</span> minBlockCount,</div> -<div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>  <span class="keywordtype">size_t</span> maxBlockCount,</div> -<div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>  <span class="keywordtype">bool</span> explicitBlockSize,</div> -<div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>  uint32_t algorithm);</div> -<div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>  ~VmaBlockVector();</div> -<div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>  </div> -<div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>  VkResult CreateMinBlocks();</div> -<div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>  </div> -<div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> GetAllocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hAllocator; }</div> -<div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div> -<div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>  <span class="keywordtype">bool</span> IsCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool != VMA_NULL; }</div> -<div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> -<div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>  VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div> -<div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>  VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div> -<div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>  uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div> -<div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>  uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div> +<div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>  </div> +<div class="line"><a name="l06987"></a><span class="lineno"> 6987</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> +<div class="line"><a name="l06989"></a><span class="lineno"> 6989</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>  </div> +<div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> +<div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>  uint32_t strategy,</div> +<div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>  </div> +<div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>  </div> +<div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> +<div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>  </div> +<div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div> +<div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>  </div> +<div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> +<div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> <div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>  </div> -<div class="line"><a name="l07018"></a><span class="lineno"> 7018</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="l07019"></a><span class="lineno"> 7019</span>  </div> -<div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>  <span class="keywordtype">bool</span> IsEmpty();</div> -<div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>  <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div> -<div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>  </div> -<div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>  VkResult Allocate(</div> -<div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>  VkDeviceSize size,</div> -<div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l07027"></a><span class="lineno"> 7027</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="l07028"></a><span class="lineno"> 7028</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>  </div> -<div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>  <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>  </div> -<div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>  <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div> -<div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>  <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div> -<div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>  </div> -<div class="line"><a name="l07037"></a><span class="lineno"> 7037</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>  <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json);</div> -<div class="line"><a name="l07039"></a><span class="lineno"> 7039</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>  </div> -<div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>  <span class="keywordtype">void</span> MakePoolAllocationsLost(</div> -<div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount);</div> -<div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>  VkResult CheckCorruption();</div> -<div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>  </div> -<div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>  <span class="comment">// Saves results in pCtx->res.</span></div> -<div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>  <span class="keywordtype">void</span> Defragment(</div> -<div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div> -<div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div> -<div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>  VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,</div> -<div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>  VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,</div> -<div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>  VkCommandBuffer commandBuffer);</div> -<div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>  <span class="keywordtype">void</span> DefragmentationEnd(</div> -<div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div> -<div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>  uint32_t flags,</div> -<div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> -<div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>  </div> -<div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>  uint32_t ProcessDefragmentations(</div> -<div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div> -<div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>  <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves);</div> -<div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>  </div> -<div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>  <span class="keywordtype">void</span> CommitDefragmentations(</div> -<div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div> -<div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> -<div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>  </div> -<div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>  <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div> -<div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>  </div> -<div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>  <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div> -<div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>  VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div> -<div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>  <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div> -<div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>  <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</div> -<div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>  </div> -<div class="line"><a name="l07074"></a><span class="lineno"> 7074</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div> -<div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>  </div> -<div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> -<div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div> -<div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>  <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div> -<div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>  <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div> -<div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div> -<div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div> -<div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>  <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div> -<div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>  <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div> -<div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div> -<div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>  <span class="keyword">const</span> uint32_t m_Algorithm;</div> -<div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>  VMA_RW_MUTEX m_Mutex;</div> +<div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div> +<div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>  </div> +<div class="line"><a name="l07021"></a><span class="lineno"> 7021</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07023"></a><span class="lineno"> 7023</span> <span class="comment"> There are two suballocation vectors, used in ping-pong way.</span></div> +<div class="line"><a name="l07024"></a><span class="lineno"> 7024</span> <span class="comment"> The one with index m_1stVectorIndex is called 1st.</span></div> +<div class="line"><a name="l07025"></a><span class="lineno"> 7025</span> <span class="comment"> The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div> +<div class="line"><a name="l07026"></a><span class="lineno"> 7026</span> <span class="comment"> 2nd can be non-empty only when 1st is not empty.</span></div> +<div class="line"><a name="l07027"></a><span class="lineno"> 7027</span> <span class="comment"> When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div> +<div class="line"><a name="l07028"></a><span class="lineno"> 7028</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>  <span class="keyword">typedef</span> VmaVector< VmaSuballocation, VmaStlAllocator<VmaSuballocation> > SuballocationVectorType;</div> +<div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>  </div> +<div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>  <span class="keyword">enum</span> SECOND_VECTOR_MODE</div> +<div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>  {</div> +<div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>  SECOND_VECTOR_EMPTY,</div> +<div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07035"></a><span class="lineno"> 7035</span> <span class="comment"> Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div> +<div class="line"><a name="l07036"></a><span class="lineno"> 7036</span> <span class="comment"> all have smaller offset.</span></div> +<div class="line"><a name="l07037"></a><span class="lineno"> 7037</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>  SECOND_VECTOR_RING_BUFFER,</div> +<div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07040"></a><span class="lineno"> 7040</span> <span class="comment"> Suballocations in 2nd vector are upper side of double stack.</span></div> +<div class="line"><a name="l07041"></a><span class="lineno"> 7041</span> <span class="comment"> They all have offsets higher than those in 1st vector.</span></div> +<div class="line"><a name="l07042"></a><span class="lineno"> 7042</span> <span class="comment"> Top of this stack means smaller offsets, but higher indices in this vector.</span></div> +<div class="line"><a name="l07043"></a><span class="lineno"> 7043</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>  SECOND_VECTOR_DOUBLE_STACK,</div> +<div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>  };</div> +<div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>  </div> +<div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>  VkDeviceSize m_SumFreeSize;</div> +<div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>  SuballocationVectorType m_Suballocations0, m_Suballocations1;</div> +<div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>  uint32_t m_1stVectorIndex;</div> +<div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>  SECOND_VECTOR_MODE m_2ndVectorMode;</div> +<div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>  </div> +<div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>  SuballocationVectorType& AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div> +<div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>  SuballocationVectorType& AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div> +<div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>  <span class="keyword">const</span> SuballocationVectorType& AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div> +<div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>  <span class="keyword">const</span> SuballocationVectorType& AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div> +<div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>  </div> +<div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>  <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div> +<div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>  <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>  <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div> +<div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>  <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>  <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div> +<div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>  <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div> +<div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>  </div> +<div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>  <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>  <span class="keywordtype">void</span> CleanupAfterFree();</div> +<div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>  </div> +<div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>  <span class="keywordtype">bool</span> CreateAllocationRequest_LowerAddress(</div> +<div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>  uint32_t strategy,</div> +<div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>  <span class="keywordtype">bool</span> CreateAllocationRequest_UpperAddress(</div> +<div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>  uint32_t strategy,</div> +<div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07087"></a><span class="lineno"> 7087</span> };</div> <div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>  </div> -<div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>  <span class="comment">/* There can be at most one allocation that is completely empty (except when minBlockCount > 0) -</span></div> -<div class="line"><a name="l07090"></a><span class="lineno"> 7090</span> <span class="comment"> a hysteresis to avoid pessimistic case of alternating creation and destruction of a VkDeviceMemory. */</span></div> -<div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>  <span class="keywordtype">bool</span> m_HasEmptyBlock;</div> -<div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>  <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div> -<div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>  VmaVector< VmaDeviceMemoryBlock*, VmaStlAllocator<VmaDeviceMemoryBlock*> > m_Blocks;</div> -<div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>  uint32_t m_NextBlockId;</div> -<div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>  </div> -<div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>  VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div> -<div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>  </div> -<div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>  <span class="comment">// Finds and removes given block from vector.</span></div> -<div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>  <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div> -<div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>  </div> -<div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>  <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div> -<div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>  <span class="comment">// after this call.</span></div> -<div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>  <span class="keywordtype">void</span> IncrementallySortBlocks();</div> -<div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>  </div> -<div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>  VkResult AllocatePage(</div> -<div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>  VkDeviceSize size,</div> -<div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l07109"></a><span class="lineno"> 7109</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="l07110"></a><span class="lineno"> 7110</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> -<div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>  </div> -<div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>  <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div> -<div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>  VkResult AllocateFromBlock(</div> -<div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>  VmaDeviceMemoryBlock* pBlock,</div> -<div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>  VkDeviceSize size,</div> -<div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div> -<div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>  <span class="keywordtype">void</span>* pUserData,</div> -<div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>  uint32_t strategy,</div> -<div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> -<div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>  </div> -<div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>  VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div> -<div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>  </div> -<div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>  <span class="comment">// Saves result to pCtx->res.</span></div> -<div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>  <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div> -<div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div> -<div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves);</div> -<div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>  <span class="comment">// Saves result to pCtx->res.</span></div> -<div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>  <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div> -<div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div> -<div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> -<div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>  VkCommandBuffer commandBuffer);</div> -<div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>  </div> -<div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l07138"></a><span class="lineno"> 7138</span> <span class="comment"> Used during defragmentation. pDefragmentationStats is optional. It's in/out</span></div> -<div class="line"><a name="l07139"></a><span class="lineno"> 7139</span> <span class="comment"> - updated with new data.</span></div> -<div class="line"><a name="l07140"></a><span class="lineno"> 7140</span> <span class="comment"> */</span></div> -<div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>  <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div> -<div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>  </div> -<div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>  <span class="keywordtype">void</span> UpdateHasEmptyBlock();</div> -<div class="line"><a name="l07144"></a><span class="lineno"> 7144</span> };</div> -<div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>  </div> -<div class="line"><a name="l07146"></a><span class="lineno"> 7146</span> <span class="keyword">struct </span>VmaPool_T</div> -<div class="line"><a name="l07147"></a><span class="lineno"> 7147</span> {</div> -<div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>  VMA_CLASS_NO_COPY(VmaPool_T)</div> -<div class="line"><a name="l07149"></a><span class="lineno"> 7149</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>  VmaBlockVector m_BlockVector;</div> -<div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>  </div> -<div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>  VmaPool_T(</div> -<div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> -<div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>  VkDeviceSize preferredBlockSize);</div> -<div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>  ~VmaPool_T();</div> -<div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>  </div> -<div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>  uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div> -<div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>  <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div> +<div class="line"><a name="l07089"></a><span class="lineno"> 7089</span> <span class="comment">/*</span></div> +<div class="line"><a name="l07090"></a><span class="lineno"> 7090</span> <span class="comment">- GetSize() is the original size of allocated memory block.</span></div> +<div class="line"><a name="l07091"></a><span class="lineno"> 7091</span> <span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div> +<div class="line"><a name="l07092"></a><span class="lineno"> 7092</span> <span class="comment"> All allocations and calculations happen relative to m_UsableSize.</span></div> +<div class="line"><a name="l07093"></a><span class="lineno"> 7093</span> <span class="comment">- GetUnusableSize() is the difference between them.</span></div> +<div class="line"><a name="l07094"></a><span class="lineno"> 7094</span> <span class="comment"> It is reported as separate, unused range, not available for allocations.</span></div> +<div class="line"><a name="l07095"></a><span class="lineno"> 7095</span> <span class="comment"></span> </div> +<div class="line"><a name="l07096"></a><span class="lineno"> 7096</span> <span class="comment">Node at level 0 has size = m_UsableSize.</span></div> +<div class="line"><a name="l07097"></a><span class="lineno"> 7097</span> <span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div> +<div class="line"><a name="l07098"></a><span class="lineno"> 7098</span> <span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div> +<div class="line"><a name="l07099"></a><span class="lineno"> 7099</span> <span class="comment">*/</span></div> +<div class="line"><a name="l07100"></a><span class="lineno"> 7100</span> <span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</div> +<div class="line"><a name="l07101"></a><span class="lineno"> 7101</span> {</div> +<div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>  VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div> +<div class="line"><a name="l07103"></a><span class="lineno"> 7103</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>  VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>  <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div> +<div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div> +<div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>  </div> +<div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>  <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div> +<div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>  <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div> +<div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>  <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root->type == Node::TYPE_FREE; }</div> +<div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>  </div> +<div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>  </div> +<div class="line"><a name="l07117"></a><span class="lineno"> 7117</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07119"></a><span class="lineno"> 7119</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>  </div> +<div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div> +<div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>  uint32_t strategy,</div> +<div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>  </div> +<div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>  <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>  VmaAllocationRequest* pAllocationRequest);</div> +<div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>  </div> +<div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>  <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div> +<div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>  </div> +<div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>  <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div> +<div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>  </div> +<div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div> +<div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> +<div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>  </div> +<div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation->GetOffset()); }</div> +<div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</div> +<div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>  </div> +<div class="line"><a name="l07151"></a><span class="lineno"> 7151</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>  <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div> +<div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</div> +<div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>  </div> +<div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>  <span class="keyword">struct </span>ValidationContext</div> +<div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>  {</div> +<div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>  <span class="keywordtype">size_t</span> calculatedAllocationCount;</div> +<div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>  <span class="keywordtype">size_t</span> calculatedFreeCount;</div> +<div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>  VkDeviceSize calculatedSumFreeSize;</div> <div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>  </div> -<div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetName()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Name; }</div> -<div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>  <span class="keywordtype">void</span> SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName);</div> -<div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>  </div> -<div class="line"><a name="l07164"></a><span class="lineno"> 7164</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>  <span class="comment">//void PrintDetailedMap(class VmaStringBuilder& sb);</span></div> -<div class="line"><a name="l07166"></a><span class="lineno"> 7166</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>  </div> -<div class="line"><a name="l07168"></a><span class="lineno"> 7168</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>  uint32_t m_Id;</div> -<div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>  <span class="keywordtype">char</span>* m_Name;</div> -<div class="line"><a name="l07171"></a><span class="lineno"> 7171</span> };</div> -<div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>  </div> -<div class="line"><a name="l07173"></a><span class="lineno"> 7173</span> <span class="comment">/*</span></div> -<div class="line"><a name="l07174"></a><span class="lineno"> 7174</span> <span class="comment">Performs defragmentation:</span></div> -<div class="line"><a name="l07175"></a><span class="lineno"> 7175</span> <span class="comment"></span> </div> -<div class="line"><a name="l07176"></a><span class="lineno"> 7176</span> <span class="comment">- Updates `pBlockVector->m_pMetadata`.</span></div> -<div class="line"><a name="l07177"></a><span class="lineno"> 7177</span> <span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div> -<div class="line"><a name="l07178"></a><span class="lineno"> 7178</span> <span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div> -<div class="line"><a name="l07179"></a><span class="lineno"> 7179</span> <span class="comment">*/</span></div> -<div class="line"><a name="l07180"></a><span class="lineno"> 7180</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm</div> -<div class="line"><a name="l07181"></a><span class="lineno"> 7181</span> {</div> -<div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div> -<div class="line"><a name="l07183"></a><span class="lineno"> 7183</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>  VmaDefragmentationAlgorithm(</div> -<div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>  VmaBlockVector* pBlockVector,</div> -<div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>  uint32_t currentFrameIndex) :</div> -<div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>  m_hAllocator(hAllocator),</div> -<div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>  m_pBlockVector(pBlockVector),</div> -<div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>  m_CurrentFrameIndex(currentFrameIndex)</div> -<div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>  {</div> -<div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>  }</div> -<div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</div> -<div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>  {</div> -<div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>  }</div> -<div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>  </div> -<div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div> -<div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</div> -<div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>  </div> -<div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> -<div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> -<div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>  VkDeviceSize maxBytesToMove,</div> -<div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>  uint32_t maxAllocationsToMove,</div> -<div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags) = 0;</div> -<div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>  </div> -<div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</div> -<div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>  </div> -<div class="line"><a name="l07209"></a><span class="lineno"> 7209</span> <span class="keyword">protected</span>:</div> -<div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div> -<div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>  VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div> -<div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>  <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div> +<div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>  ValidationContext() :</div> +<div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>  calculatedAllocationCount(0),</div> +<div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>  calculatedFreeCount(0),</div> +<div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>  calculatedSumFreeSize(0) { }</div> +<div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>  };</div> +<div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>  </div> +<div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>  <span class="keyword">struct </span>Node</div> +<div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>  {</div> +<div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>  VkDeviceSize offset;</div> +<div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>  <span class="keyword">enum</span> TYPE</div> +<div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>  {</div> +<div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>  TYPE_FREE,</div> +<div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>  TYPE_ALLOCATION,</div> +<div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>  TYPE_SPLIT,</div> +<div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>  TYPE_COUNT</div> +<div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>  } type;</div> +<div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>  Node* parent;</div> +<div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>  Node* buddy;</div> +<div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>  </div> +<div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>  <span class="keyword">union</span></div> +<div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>  {</div> +<div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>  <span class="keyword">struct</span></div> +<div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>  {</div> +<div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>  Node* prev;</div> +<div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>  Node* next;</div> +<div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>  } free;</div> +<div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>  <span class="keyword">struct</span></div> +<div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>  {</div> +<div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div> +<div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>  } allocation;</div> +<div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>  <span class="keyword">struct</span></div> +<div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>  {</div> +<div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>  Node* leftChild;</div> +<div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>  } split;</div> +<div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>  };</div> +<div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>  };</div> +<div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>  </div> +<div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>  <span class="comment">// Size of the memory block aligned down to a power of two.</span></div> +<div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>  VkDeviceSize m_UsableSize;</div> +<div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>  uint32_t m_LevelCount;</div> +<div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>  </div> +<div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>  Node* m_Root;</div> +<div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>  <span class="keyword">struct </span>{</div> +<div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>  Node* front;</div> +<div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>  Node* back;</div> +<div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>  } m_FreeList[MAX_LEVELS];</div> +<div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>  <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div> +<div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>  <span class="keywordtype">size_t</span> m_AllocationCount;</div> +<div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>  <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div> +<div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>  <span class="keywordtype">size_t</span> m_FreeCount;</div> +<div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>  <span class="comment">// This includes space wasted due to internal fragmentation. Doesn't include unusable size.</span></div> +<div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>  VkDeviceSize m_SumFreeSize;</div> <div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>  </div> -<div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>  <span class="keyword">struct </span>AllocationInfo</div> -<div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>  {</div> -<div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div> -<div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>  VkBool32* m_pChanged;</div> -<div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>  </div> -<div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>  AllocationInfo() :</div> -<div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>  m_hAllocation(VK_NULL_HANDLE),</div> -<div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>  m_pChanged(VMA_NULL)</div> -<div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>  {</div> -<div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>  }</div> -<div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>  AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div> -<div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>  m_hAllocation(hAlloc),</div> -<div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>  m_pChanged(pChanged)</div> -<div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>  {</div> -<div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>  }</div> -<div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>  };</div> -<div class="line"><a name="l07230"></a><span class="lineno"> 7230</span> };</div> -<div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>  </div> -<div class="line"><a name="l07232"></a><span class="lineno"> 7232</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div> -<div class="line"><a name="l07233"></a><span class="lineno"> 7233</span> {</div> -<div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div> -<div class="line"><a name="l07235"></a><span class="lineno"> 7235</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>  VmaDefragmentationAlgorithm_Generic(</div> -<div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>  VmaBlockVector* pBlockVector,</div> -<div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>  <span class="keywordtype">bool</span> overlappingMoveSupported);</div> -<div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</div> -<div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>  </div> -<div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div> -<div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> -<div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>  </div> -<div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> -<div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> -<div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>  VkDeviceSize maxBytesToMove,</div> -<div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>  uint32_t maxAllocationsToMove,</div> -<div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> -<div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>  </div> -<div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div> -<div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div> -<div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>  </div> -<div class="line"><a name="l07255"></a><span class="lineno"> 7255</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>  uint32_t m_AllocationCount;</div> -<div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> -<div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>  </div> -<div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>  VkDeviceSize m_BytesMoved;</div> -<div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>  uint32_t m_AllocationsMoved;</div> -<div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>  </div> -<div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>  <span class="keyword">struct </span>AllocationInfoSizeGreater</div> -<div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>  {</div> -<div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo& lhs, <span class="keyword">const</span> AllocationInfo& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l07265"></a><span class="lineno"> 7265</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>  <span class="keywordflow">return</span> lhs.m_hAllocation->GetSize() > rhs.m_hAllocation->GetSize();</div> -<div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>  }</div> -<div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>  };</div> -<div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>  </div> -<div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>  <span class="keyword">struct </span>AllocationInfoOffsetGreater</div> -<div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>  {</div> -<div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo& lhs, <span class="keyword">const</span> AllocationInfo& rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l07273"></a><span class="lineno"> 7273</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>  <span class="keywordflow">return</span> lhs.m_hAllocation->GetOffset() > rhs.m_hAllocation->GetOffset();</div> -<div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>  }</div> -<div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>  };</div> -<div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>  </div> -<div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>  <span class="keyword">struct </span>BlockInfo</div> -<div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>  {</div> -<div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>  <span class="keywordtype">size_t</span> m_OriginalBlockIndex;</div> -<div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>  VmaDeviceMemoryBlock* m_pBlock;</div> -<div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>  <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div> -<div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>  VmaVector< AllocationInfo, VmaStlAllocator<AllocationInfo> > m_Allocations;</div> -<div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>  </div> -<div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>  BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div> -<div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>  m_OriginalBlockIndex(SIZE_MAX),</div> -<div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>  m_pBlock(VMA_NULL),</div> -<div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>  m_HasNonMovableAllocations(true),</div> -<div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>  m_Allocations(pAllocationCallbacks)</div> -<div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>  {</div> -<div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>  }</div> -<div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>  </div> -<div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>  <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div> -<div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>  {</div> -<div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock->m_pMetadata->GetAllocationCount();</div> -<div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div> -<div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>  m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div> -<div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>  }</div> -<div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>  </div> -<div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>  <span class="keywordtype">void</span> SortAllocationsBySizeDescending()</div> -<div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>  {</div> -<div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>  VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div> -<div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>  }</div> +<div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>  VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div> +<div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>  <span class="keywordtype">void</span> DeleteNode(Node* node);</div> +<div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>  <span class="keywordtype">bool</span> ValidateNode(ValidationContext& ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>  uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>  <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize >> level; }</div> +<div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>  <span class="comment">// Alloc passed just for validation. Can be null.</span></div> +<div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>  <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div> +<div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>  <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>  <span class="comment">// Adds node to the front of FreeList at given level.</span></div> +<div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>  <span class="comment">// node->type must be FREE.</span></div> +<div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>  <span class="comment">// node->free.prev, next can be undefined.</span></div> +<div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>  <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div> +<div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>  <span class="comment">// Removes node from FreeList at given level.</span></div> +<div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>  <span class="comment">// node->type must be FREE.</span></div> +<div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>  <span class="comment">// node->free.prev, next stay untouched.</span></div> +<div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>  <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</div> +<div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>  </div> +<div class="line"><a name="l07231"></a><span class="lineno"> 7231</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>  <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter& json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div> +<div class="line"><a name="l07233"></a><span class="lineno"> 7233</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l07234"></a><span class="lineno"> 7234</span> };</div> +<div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>  </div> +<div class="line"><a name="l07236"></a><span class="lineno"> 7236</span> <span class="comment">/*</span></div> +<div class="line"><a name="l07237"></a><span class="lineno"> 7237</span> <span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div> +<div class="line"><a name="l07238"></a><span class="lineno"> 7238</span> <span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div> +<div class="line"><a name="l07239"></a><span class="lineno"> 7239</span> <span class="comment"></span> </div> +<div class="line"><a name="l07240"></a><span class="lineno"> 7240</span> <span class="comment">Thread-safety: This class must be externally synchronized.</span></div> +<div class="line"><a name="l07241"></a><span class="lineno"> 7241</span> <span class="comment">*/</span></div> +<div class="line"><a name="l07242"></a><span class="lineno"> 7242</span> <span class="keyword">class </span>VmaDeviceMemoryBlock</div> +<div class="line"><a name="l07243"></a><span class="lineno"> 7243</span> {</div> +<div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>  VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div> +<div class="line"><a name="l07245"></a><span class="lineno"> 7245</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>  VmaBlockMetadata* m_pMetadata;</div> +<div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>  </div> +<div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>  VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>  </div> +<div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>  ~VmaDeviceMemoryBlock()</div> +<div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>  {</div> +<div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>  VMA_ASSERT(m_MapCount == 0 && <span class="stringliteral">"VkDeviceMemory block is being destroyed while it is still mapped."</span>);</div> +<div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>  VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div> +<div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>  }</div> +<div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>  </div> +<div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>  <span class="comment">// Always call after construction.</span></div> +<div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>  <span class="keywordtype">void</span> Init(</div> +<div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> +<div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>  uint32_t newMemoryTypeIndex,</div> +<div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>  VkDeviceMemory newMemory,</div> +<div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>  VkDeviceSize newSize,</div> +<div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>  uint32_t <span class="keywordtype">id</span>,</div> +<div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>  uint32_t algorithm);</div> +<div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>  <span class="comment">// Always call before destruction.</span></div> +<div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>  <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div> +<div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>  </div> +<div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div> +<div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>  VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div> +<div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> +<div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>  uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div> +<div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>  <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div> +<div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>  </div> +<div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>  <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div> +<div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>  <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>  </div> +<div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>  VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div> +<div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>  </div> +<div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>  <span class="comment">// ppData can be null.</span></div> +<div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>  VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div> +<div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>  <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div> +<div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>  </div> +<div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>  VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div> +<div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>  VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div> +<div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>  </div> +<div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>  VkResult BindBufferMemory(</div> +<div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>  VkBuffer hBuffer,</div> +<div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> +<div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>  VkResult BindImageMemory(</div> +<div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>  VkImage hImage,</div> +<div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> +<div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>  </div> +<div class="line"><a name="l07299"></a><span class="lineno"> 7299</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool; <span class="comment">// VK_NULL_HANDLE if not belongs to custom pool.</span></div> +<div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>  uint32_t m_MemoryTypeIndex;</div> +<div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>  uint32_t m_Id;</div> +<div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>  VkDeviceMemory m_hMemory;</div> <div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>  </div> -<div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>  <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</div> -<div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>  {</div> -<div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>  VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</div> -<div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>  }</div> -<div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>  };</div> -<div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>  </div> -<div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>  <span class="keyword">struct </span>BlockPointerLess</div> -<div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>  {</div> -<div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div> -<div class="line"><a name="l07314"></a><span class="lineno"> 7314</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>  <span class="keywordflow">return</span> pLhsBlockInfo->m_pBlock < pRhsBlock;</div> -<div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>  }</div> -<div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div> -<div class="line"><a name="l07318"></a><span class="lineno"> 7318</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>  <span class="keywordflow">return</span> pLhsBlockInfo->m_pBlock < pRhsBlockInfo->m_pBlock;</div> -<div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>  }</div> -<div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>  };</div> -<div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>  </div> -<div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>  <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div> -<div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>  <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div> -<div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>  <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div> -<div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>  {</div> -<div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div> -<div class="line"><a name="l07328"></a><span class="lineno"> 7328</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>  <span class="keywordflow">if</span>(pLhsBlockInfo->m_HasNonMovableAllocations && !pRhsBlockInfo->m_HasNonMovableAllocations)</div> -<div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>  {</div> -<div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>  }</div> -<div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>  <span class="keywordflow">if</span>(!pLhsBlockInfo->m_HasNonMovableAllocations && pRhsBlockInfo->m_HasNonMovableAllocations)</div> -<div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>  {</div> -<div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>  }</div> -<div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>  <span class="keywordflow">if</span>(pLhsBlockInfo->m_pBlock->m_pMetadata->GetSumFreeSize() < pRhsBlockInfo->m_pBlock->m_pMetadata->GetSumFreeSize())</div> -<div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>  {</div> -<div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>  }</div> -<div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>  }</div> -<div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>  };</div> -<div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>  </div> -<div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>  <span class="keyword">typedef</span> VmaVector< BlockInfo*, VmaStlAllocator<BlockInfo*> > BlockInfoVector;</div> -<div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>  BlockInfoVector m_Blocks;</div> -<div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>  </div> -<div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>  VkResult DefragmentRound(</div> -<div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> -<div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>  VkDeviceSize maxBytesToMove,</div> -<div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>  uint32_t maxAllocationsToMove,</div> -<div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>  <span class="keywordtype">bool</span> freeOldAllocations);</div> -<div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>  </div> -<div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>  <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div> -<div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>  </div> -<div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div> -<div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>  <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div> -<div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>  <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div> -<div class="line"><a name="l07359"></a><span class="lineno"> 7359</span> };</div> -<div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>  </div> -<div class="line"><a name="l07361"></a><span class="lineno"> 7361</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div> -<div class="line"><a name="l07362"></a><span class="lineno"> 7362</span> {</div> -<div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div> -<div class="line"><a name="l07364"></a><span class="lineno"> 7364</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>  VmaDefragmentationAlgorithm_Fast(</div> -<div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>  VmaBlockVector* pBlockVector,</div> -<div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>  <span class="keywordtype">bool</span> overlappingMoveSupported);</div> -<div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div> -<div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>  </div> -<div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div> -<div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> -<div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>  </div> -<div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> -<div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> -<div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>  VkDeviceSize maxBytesToMove,</div> -<div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>  uint32_t maxAllocationsToMove,</div> -<div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> -<div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>  </div> -<div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div> -<div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div> -<div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>  </div> -<div class="line"><a name="l07384"></a><span class="lineno"> 7384</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>  <span class="keyword">struct </span>BlockInfo</div> -<div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>  {</div> -<div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>  <span class="keywordtype">size_t</span> origBlockIndex;</div> -<div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>  };</div> -<div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>  </div> -<div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>  <span class="keyword">class </span>FreeSpaceDatabase</div> -<div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>  {</div> -<div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>  FreeSpaceDatabase()</div> -<div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>  {</div> -<div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>  FreeSpace s = {};</div> -<div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>  s.blockInfoIndex = SIZE_MAX;</div> -<div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> -<div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>  {</div> -<div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>  m_FreeSpaces[i] = s;</div> -<div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>  }</div> -<div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>  }</div> -<div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>  </div> -<div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>  <span class="keywordtype">void</span> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div> -<div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>  {</div> -<div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>  <span class="keywordflow">if</span>(size < VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> -<div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>  {</div> -<div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>  }</div> +<div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07306"></a><span class="lineno"> 7306</span> <span class="comment"> Protects access to m_hMemory so it's not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div> +<div class="line"><a name="l07307"></a><span class="lineno"> 7307</span> <span class="comment"> Also protects m_MapCount, m_pMappedData.</span></div> +<div class="line"><a name="l07308"></a><span class="lineno"> 7308</span> <span class="comment"> Allocations, deallocations, any change in m_pMetadata is protected by parent's VmaBlockVector::m_Mutex.</span></div> +<div class="line"><a name="l07309"></a><span class="lineno"> 7309</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>  VMA_MUTEX m_Mutex;</div> +<div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>  uint32_t m_MapCount;</div> +<div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>  <span class="keywordtype">void</span>* m_pMappedData;</div> +<div class="line"><a name="l07313"></a><span class="lineno"> 7313</span> };</div> +<div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>  </div> +<div class="line"><a name="l07315"></a><span class="lineno"> 7315</span> <span class="keyword">struct </span>VmaDefragmentationMove</div> +<div class="line"><a name="l07316"></a><span class="lineno"> 7316</span> {</div> +<div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>  <span class="keywordtype">size_t</span> srcBlockIndex;</div> +<div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>  <span class="keywordtype">size_t</span> dstBlockIndex;</div> +<div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>  VkDeviceSize srcOffset;</div> +<div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>  VkDeviceSize dstOffset;</div> +<div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>  VkDeviceSize size;</div> +<div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div> +<div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>  VmaDeviceMemoryBlock* pSrcBlock;</div> +<div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>  VmaDeviceMemoryBlock* pDstBlock;</div> +<div class="line"><a name="l07325"></a><span class="lineno"> 7325</span> };</div> +<div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>  </div> +<div class="line"><a name="l07327"></a><span class="lineno"> 7327</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm;</div> +<div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>  </div> +<div class="line"><a name="l07329"></a><span class="lineno"> 7329</span> <span class="comment">/*</span></div> +<div class="line"><a name="l07330"></a><span class="lineno"> 7330</span> <span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div> +<div class="line"><a name="l07331"></a><span class="lineno"> 7331</span> <span class="comment">Vulkan memory type.</span></div> +<div class="line"><a name="l07332"></a><span class="lineno"> 7332</span> <span class="comment"></span> </div> +<div class="line"><a name="l07333"></a><span class="lineno"> 7333</span> <span class="comment">Synchronized internally with a mutex.</span></div> +<div class="line"><a name="l07334"></a><span class="lineno"> 7334</span> <span class="comment">*/</span></div> +<div class="line"><a name="l07335"></a><span class="lineno"> 7335</span> <span class="keyword">struct </span>VmaBlockVector</div> +<div class="line"><a name="l07336"></a><span class="lineno"> 7336</span> {</div> +<div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>  VMA_CLASS_NO_COPY(VmaBlockVector)</div> +<div class="line"><a name="l07338"></a><span class="lineno"> 7338</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>  VmaBlockVector(</div> +<div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> +<div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>  uint32_t memoryTypeIndex,</div> +<div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>  VkDeviceSize preferredBlockSize,</div> +<div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>  <span class="keywordtype">size_t</span> minBlockCount,</div> +<div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>  <span class="keywordtype">size_t</span> maxBlockCount,</div> +<div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>  <span class="keywordtype">bool</span> explicitBlockSize,</div> +<div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>  uint32_t algorithm,</div> +<div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>  <span class="keywordtype">float</span> priority,</div> +<div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>  VkDeviceSize minAllocationAlignment,</div> +<div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>  <span class="keywordtype">void</span>* pMemoryAllocateNext);</div> +<div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>  ~VmaBlockVector();</div> +<div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>  </div> +<div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>  VkResult CreateMinBlocks();</div> +<div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>  </div> +<div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> GetAllocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hAllocator; }</div> +<div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetParentPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool; }</div> +<div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>  <span class="keywordtype">bool</span> IsCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hParentPool != VMA_NULL; }</div> +<div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>  uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div> +<div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>  VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div> +<div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>  VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div> +<div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>  uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div> +<div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>  uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</div> +<div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>  </div> +<div class="line"><a name="l07366"></a><span class="lineno"> 7366</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="l07367"></a><span class="lineno"> 7367</span>  </div> +<div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>  <span class="keywordtype">bool</span> IsEmpty();</div> +<div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>  <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>  </div> +<div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>  VkResult Allocate(</div> +<div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>  VkDeviceSize size,</div> +<div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>  VkDeviceSize alignment,</div> +<div class="line"><a name="l07375"></a><span class="lineno"> 7375</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="l07376"></a><span class="lineno"> 7376</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>  </div> +<div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>  <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> +<div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>  </div> +<div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>  <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div> +<div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>  <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div> +<div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>  </div> +<div class="line"><a name="l07385"></a><span class="lineno"> 7385</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>  <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json);</div> +<div class="line"><a name="l07387"></a><span class="lineno"> 7387</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>  </div> +<div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>  <span class="keywordtype">void</span> MakePoolAllocationsLost(</div> +<div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount);</div> +<div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>  VkResult CheckCorruption();</div> +<div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>  </div> +<div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>  <span class="comment">// Saves results in pCtx->res.</span></div> +<div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>  <span class="keywordtype">void</span> Defragment(</div> +<div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div> +<div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags,</div> +<div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>  VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,</div> +<div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>  VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,</div> +<div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>  VkCommandBuffer commandBuffer);</div> +<div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>  <span class="keywordtype">void</span> DefragmentationEnd(</div> +<div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pCtx,</div> +<div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>  uint32_t flags,</div> +<div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> +<div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>  </div> +<div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>  uint32_t ProcessDefragmentations(</div> +<div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div> +<div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>  <a class="code" href="struct_vma_defragmentation_pass_move_info.html">VmaDefragmentationPassMoveInfo</a>* pMove, uint32_t maxMoves);</div> <div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>  </div> -<div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>  <span class="comment">// Find first invalid or the smallest structure.</span></div> -<div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>  <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div> -<div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> -<div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>  {</div> -<div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>  <span class="comment">// Empty structure.</span></div> -<div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</div> -<div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>  {</div> -<div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>  bestIndex = i;</div> -<div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>  }</div> -<div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].size < size &&</div> -<div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>  (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size > m_FreeSpaces[i].size))</div> -<div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>  {</div> -<div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>  bestIndex = i;</div> -<div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>  }</div> -<div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>  }</div> -<div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>  </div> -<div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>  <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div> -<div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>  {</div> -<div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>  m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div> -<div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>  m_FreeSpaces[bestIndex].offset = offset;</div> -<div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>  m_FreeSpaces[bestIndex].size = size;</div> -<div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>  }</div> -<div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>  }</div> -<div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>  </div> -<div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>  <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div> -<div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>  <span class="keywordtype">size_t</span>& outBlockInfoIndex, VkDeviceSize& outDstOffset)</div> -<div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>  {</div> -<div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>  <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div> -<div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>  VkDeviceSize bestFreeSpaceAfter = 0;</div> -<div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> -<div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>  {</div> -<div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>  <span class="comment">// Structure is valid.</span></div> -<div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</div> -<div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>  {</div> -<div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>  <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div> -<div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>  <span class="comment">// Allocation fits into this structure.</span></div> -<div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>  <span class="keywordflow">if</span>(dstOffset + size <= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div> -<div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>  {</div> -<div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>  <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div> -<div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>  (dstOffset + size);</div> -<div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>  <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter > bestFreeSpaceAfter)</div> -<div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>  {</div> -<div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>  bestIndex = i;</div> -<div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>  bestFreeSpaceAfter = freeSpaceAfter;</div> -<div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>  }</div> -<div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>  }</div> -<div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>  }</div> -<div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>  }</div> -<div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>  </div> -<div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>  <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div> -<div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>  {</div> -<div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>  outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div> -<div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>  outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</div> -<div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>  </div> -<div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>  <span class="keywordflow">if</span>(bestFreeSpaceAfter >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> -<div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>  {</div> -<div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>  <span class="comment">// Leave this structure for remaining empty space.</span></div> -<div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>  <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div> -<div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>  m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div> -<div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>  m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div> -<div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>  }</div> -<div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>  {</div> -<div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>  <span class="comment">// This structure becomes invalid.</span></div> -<div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>  m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</div> -<div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>  }</div> +<div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>  <span class="keywordtype">void</span> CommitDefragmentations(</div> +<div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext *pCtx,</div> +<div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> +<div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>  </div> +<div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>  <span class="comment">// To be used only while the m_Mutex is locked. Used during defragmentation.</span></div> +<div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>  </div> +<div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>  <span class="keywordtype">size_t</span> GetBlockCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.size(); }</div> +<div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>  VmaDeviceMemoryBlock* GetBlock(<span class="keywordtype">size_t</span> index)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks[index]; }</div> +<div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>  <span class="keywordtype">size_t</span> CalcAllocationCount() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>  <span class="keywordtype">bool</span> IsBufferImageGranularityConflictPossible() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>  </div> +<div class="line"><a name="l07422"></a><span class="lineno"> 7422</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>  <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic;</div> +<div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>  </div> +<div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> +<div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hParentPool;</div> +<div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>  <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div> +<div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>  <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div> +<div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div> +<div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div> +<div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>  <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div> +<div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>  <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div> +<div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div> +<div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>  <span class="keyword">const</span> uint32_t m_Algorithm;</div> +<div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>  <span class="keyword">const</span> <span class="keywordtype">float</span> m_Priority;</div> +<div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>  <span class="keyword">const</span> VkDeviceSize m_MinAllocationAlignment;</div> +<div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>  <span class="keywordtype">void</span>* <span class="keyword">const</span> m_pMemoryAllocateNext;</div> +<div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>  VMA_RW_MUTEX m_Mutex;</div> +<div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>  </div> +<div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>  <span class="comment">/* There can be at most one allocation that is completely empty (except when minBlockCount > 0) -</span></div> +<div class="line"><a name="l07441"></a><span class="lineno"> 7441</span> <span class="comment"> a hysteresis to avoid pessimistic case of alternating creation and destruction of a VkDeviceMemory. */</span></div> +<div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>  <span class="keywordtype">bool</span> m_HasEmptyBlock;</div> +<div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>  <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div> +<div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>  VmaVector< VmaDeviceMemoryBlock*, VmaStlAllocator<VmaDeviceMemoryBlock*> > m_Blocks;</div> +<div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>  uint32_t m_NextBlockId;</div> +<div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>  </div> +<div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>  VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div> +<div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>  </div> +<div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>  <span class="comment">// Finds and removes given block from vector.</span></div> +<div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>  <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div> +<div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>  </div> +<div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>  <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div> +<div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>  <span class="comment">// after this call.</span></div> +<div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>  <span class="keywordtype">void</span> IncrementallySortBlocks();</div> +<div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>  </div> +<div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>  VkResult AllocatePage(</div> +<div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>  VkDeviceSize size,</div> +<div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>  VkDeviceSize alignment,</div> +<div class="line"><a name="l07460"></a><span class="lineno"> 7460</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="l07461"></a><span class="lineno"> 7461</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> +<div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>  </div> +<div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>  <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div> +<div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>  VkResult AllocateFromBlock(</div> +<div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>  VmaDeviceMemoryBlock* pBlock,</div> +<div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>  VkDeviceSize size,</div> +<div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>  VkDeviceSize alignment,</div> +<div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>  <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div> +<div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>  <span class="keywordtype">void</span>* pUserData,</div> +<div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>  uint32_t strategy,</div> +<div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> +<div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>  </div> +<div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>  VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div> <div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>  </div> -<div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>  }</div> -<div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>  </div> -<div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>  }</div> -<div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>  </div> -<div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</div> -<div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>  </div> -<div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>  <span class="keyword">struct </span>FreeSpace</div> -<div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>  {</div> -<div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>  <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div> -<div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>  VkDeviceSize offset;</div> -<div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>  VkDeviceSize size;</div> -<div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>  } m_FreeSpaces[MAX_COUNT];</div> -<div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>  };</div> -<div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>  </div> -<div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</div> +<div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>  <span class="comment">// Saves result to pCtx->res.</span></div> +<div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>  <span class="keywordtype">void</span> ApplyDefragmentationMovesCpu(</div> +<div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div> +<div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>  <span class="keyword">const</span> VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves);</div> +<div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>  <span class="comment">// Saves result to pCtx->res.</span></div> +<div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>  <span class="keywordtype">void</span> ApplyDefragmentationMovesGpu(</div> +<div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>  <span class="keyword">class</span> VmaBlockVectorDefragmentationContext* pDefragCtx,</div> +<div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> +<div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>  VkCommandBuffer commandBuffer);</div> +<div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>  </div> +<div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07489"></a><span class="lineno"> 7489</span> <span class="comment"> Used during defragmentation. pDefragmentationStats is optional. It's in/out</span></div> +<div class="line"><a name="l07490"></a><span class="lineno"> 7490</span> <span class="comment"> - updated with new data.</span></div> +<div class="line"><a name="l07491"></a><span class="lineno"> 7491</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>  <span class="keywordtype">void</span> FreeEmptyBlocks(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div> +<div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>  </div> +<div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>  <span class="keywordtype">void</span> UpdateHasEmptyBlock();</div> +<div class="line"><a name="l07495"></a><span class="lineno"> 7495</span> };</div> <div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>  </div> -<div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>  uint32_t m_AllocationCount;</div> -<div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> -<div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>  </div> -<div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>  VkDeviceSize m_BytesMoved;</div> -<div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>  uint32_t m_AllocationsMoved;</div> +<div class="line"><a name="l07497"></a><span class="lineno"> 7497</span> <span class="keyword">struct </span>VmaPool_T</div> +<div class="line"><a name="l07498"></a><span class="lineno"> 7498</span> {</div> +<div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>  VMA_CLASS_NO_COPY(VmaPool_T)</div> +<div class="line"><a name="l07500"></a><span class="lineno"> 7500</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>  VmaBlockVector m_BlockVector;</div> <div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>  </div> -<div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>  VmaVector< BlockInfo, VmaStlAllocator<BlockInfo> > m_BlockInfos;</div> -<div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>  </div> -<div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>  <span class="keywordtype">void</span> PreprocessMetadata();</div> -<div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>  <span class="keywordtype">void</span> PostprocessMetadata();</div> -<div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>  <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation& suballoc);</div> -<div class="line"><a name="l07508"></a><span class="lineno"> 7508</span> };</div> -<div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>  </div> -<div class="line"><a name="l07510"></a><span class="lineno"> 7510</span> <span class="keyword">struct </span>VmaBlockDefragmentationContext</div> -<div class="line"><a name="l07511"></a><span class="lineno"> 7511</span> {</div> -<div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>  <span class="keyword">enum</span> BLOCK_FLAG</div> -<div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>  {</div> -<div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>  BLOCK_FLAG_USED = 0x00000001,</div> -<div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>  };</div> -<div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>  uint32_t flags;</div> -<div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>  VkBuffer hBuffer;</div> -<div class="line"><a name="l07518"></a><span class="lineno"> 7518</span> };</div> -<div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>  </div> -<div class="line"><a name="l07520"></a><span class="lineno"> 7520</span> <span class="keyword">class </span>VmaBlockVectorDefragmentationContext</div> -<div class="line"><a name="l07521"></a><span class="lineno"> 7521</span> {</div> -<div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>  VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div> -<div class="line"><a name="l07523"></a><span class="lineno"> 7523</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>  VkResult res;</div> -<div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>  <span class="keywordtype">bool</span> mutexLocked;</div> -<div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>  VmaVector< VmaBlockDefragmentationContext, VmaStlAllocator<VmaBlockDefragmentationContext> > blockContexts;</div> -<div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> > defragmentationMoves;</div> -<div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>  uint32_t defragmentationMovesProcessed;</div> -<div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>  uint32_t defragmentationMovesCommitted;</div> -<div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>  <span class="keywordtype">bool</span> hasDefragmentationPlan;</div> -<div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>  </div> -<div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>  VmaBlockVectorDefragmentationContext(</div> -<div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div> -<div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>  VmaBlockVector* pBlockVector,</div> -<div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>  uint32_t currFrameIndex);</div> -<div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>  ~VmaBlockVectorDefragmentationContext();</div> -<div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>  </div> -<div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div> -<div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>  VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div> -<div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>  VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</div> -<div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>  </div> -<div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>  <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div> -<div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>  <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> -<div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>  </div> -<div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>  <span class="keywordtype">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> -<div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>  </div> -<div class="line"><a name="l07548"></a><span class="lineno"> 7548</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> -<div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>  <span class="comment">// Null if not from custom pool.</span></div> -<div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div> -<div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>  <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool->m_BlockVector or m_hAllocator->m_pBlockVectors.</span></div> -<div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>  VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div> -<div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>  <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div> -<div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>  <span class="comment">// Owner of this object.</span></div> -<div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>  VmaDefragmentationAlgorithm* m_pAlgorithm;</div> -<div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>  </div> -<div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>  <span class="keyword">struct </span>AllocInfo</div> -<div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>  {</div> -<div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div> -<div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>  VkBool32* pChanged;</div> -<div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>  };</div> -<div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>  <span class="comment">// Used between constructor and Begin.</span></div> -<div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>  VmaVector< AllocInfo, VmaStlAllocator<AllocInfo> > m_Allocations;</div> -<div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> -<div class="line"><a name="l07566"></a><span class="lineno"> 7566</span> };</div> -<div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>  </div> -<div class="line"><a name="l07568"></a><span class="lineno"> 7568</span> <span class="keyword">struct </span>VmaDefragmentationContext_T</div> -<div class="line"><a name="l07569"></a><span class="lineno"> 7569</span> {</div> -<div class="line"><a name="l07570"></a><span class="lineno"> 7570</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>  VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div> -<div class="line"><a name="l07572"></a><span class="lineno"> 7572</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>  VmaDefragmentationContext_T(</div> -<div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>  uint32_t currFrameIndex,</div> -<div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>  uint32_t flags,</div> -<div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> -<div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>  ~VmaDefragmentationContext_T();</div> -<div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>  </div> -<div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>  <span class="keywordtype">void</span> AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div> -<div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>  <span class="keywordtype">void</span> AddAllocations(</div> -<div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>  uint32_t allocationCount,</div> -<div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div> -<div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>  VkBool32* pAllocationsChanged);</div> -<div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>  </div> -<div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l07587"></a><span class="lineno"> 7587</span> <span class="comment"> Returns:</span></div> -<div class="line"><a name="l07588"></a><span class="lineno"> 7588</span> <span class="comment"> - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div> -<div class="line"><a name="l07589"></a><span class="lineno"> 7589</span> <span class="comment"> - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div> -<div class="line"><a name="l07590"></a><span class="lineno"> 7590</span> <span class="comment"> - Negative value if error occured and object can be destroyed immediately.</span></div> -<div class="line"><a name="l07591"></a><span class="lineno"> 7591</span> <span class="comment"> */</span></div> -<div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>  VkResult Defragment(</div> -<div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>  VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div> -<div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>  VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div> -<div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>  VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> -<div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>  </div> -<div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>  VkResult DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo);</div> -<div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>  VkResult DefragmentPassEnd();</div> -<div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>  </div> -<div class="line"><a name="l07600"></a><span class="lineno"> 7600</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> -<div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>  <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div> -<div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>  <span class="keyword">const</span> uint32_t m_Flags;</div> -<div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div> +<div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>  VmaPool_T(</div> +<div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> +<div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>  VkDeviceSize preferredBlockSize);</div> +<div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>  ~VmaPool_T();</div> +<div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>  </div> +<div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>  uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div> +<div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>  <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div> +<div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>  </div> +<div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetName()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Name; }</div> +<div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>  <span class="keywordtype">void</span> SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName);</div> +<div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>  </div> +<div class="line"><a name="l07515"></a><span class="lineno"> 7515</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>  <span class="comment">//void PrintDetailedMap(class VmaStringBuilder& sb);</span></div> +<div class="line"><a name="l07517"></a><span class="lineno"> 7517</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>  </div> +<div class="line"><a name="l07519"></a><span class="lineno"> 7519</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>  uint32_t m_Id;</div> +<div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>  <span class="keywordtype">char</span>* m_Name;</div> +<div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>  VmaPool_T* m_PrevPool = VMA_NULL;</div> +<div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>  VmaPool_T* m_NextPool = VMA_NULL;</div> +<div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>  <span class="keyword">friend</span> <span class="keyword">struct </span>VmaPoolListItemTraits;</div> +<div class="line"><a name="l07525"></a><span class="lineno"> 7525</span> };</div> +<div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>  </div> +<div class="line"><a name="l07527"></a><span class="lineno"> 7527</span> <span class="keyword">struct </span>VmaPoolListItemTraits</div> +<div class="line"><a name="l07528"></a><span class="lineno"> 7528</span> {</div> +<div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>  <span class="keyword">typedef</span> VmaPool_T ItemType;</div> +<div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>  <span class="keyword">static</span> ItemType* GetPrev(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> item->m_PrevPool; }</div> +<div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>  <span class="keyword">static</span> ItemType* GetNext(<span class="keyword">const</span> ItemType* item) { <span class="keywordflow">return</span> item->m_NextPool; }</div> +<div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>  <span class="keyword">static</span> ItemType*& AccessPrev(ItemType* item) { <span class="keywordflow">return</span> item->m_PrevPool; }</div> +<div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>  <span class="keyword">static</span> ItemType*& AccessNext(ItemType* item) { <span class="keywordflow">return</span> item->m_NextPool; }</div> +<div class="line"><a name="l07534"></a><span class="lineno"> 7534</span> };</div> +<div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>  </div> +<div class="line"><a name="l07536"></a><span class="lineno"> 7536</span> <span class="comment">/*</span></div> +<div class="line"><a name="l07537"></a><span class="lineno"> 7537</span> <span class="comment">Performs defragmentation:</span></div> +<div class="line"><a name="l07538"></a><span class="lineno"> 7538</span> <span class="comment"></span> </div> +<div class="line"><a name="l07539"></a><span class="lineno"> 7539</span> <span class="comment">- Updates `pBlockVector->m_pMetadata`.</span></div> +<div class="line"><a name="l07540"></a><span class="lineno"> 7540</span> <span class="comment">- Updates allocations by calling ChangeBlockAllocation() or ChangeOffset().</span></div> +<div class="line"><a name="l07541"></a><span class="lineno"> 7541</span> <span class="comment">- Does not move actual data, only returns requested moves as `moves`.</span></div> +<div class="line"><a name="l07542"></a><span class="lineno"> 7542</span> <span class="comment">*/</span></div> +<div class="line"><a name="l07543"></a><span class="lineno"> 7543</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm</div> +<div class="line"><a name="l07544"></a><span class="lineno"> 7544</span> {</div> +<div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)</div> +<div class="line"><a name="l07546"></a><span class="lineno"> 7546</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>  VmaDefragmentationAlgorithm(</div> +<div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>  VmaBlockVector* pBlockVector,</div> +<div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>  uint32_t currentFrameIndex) :</div> +<div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>  m_hAllocator(hAllocator),</div> +<div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>  m_pBlockVector(pBlockVector),</div> +<div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>  m_CurrentFrameIndex(currentFrameIndex)</div> +<div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>  {</div> +<div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>  }</div> +<div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm()</div> +<div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>  {</div> +<div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>  }</div> +<div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>  </div> +<div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) = 0;</div> +<div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() = 0;</div> +<div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>  </div> +<div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> +<div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> +<div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>  VkDeviceSize maxBytesToMove,</div> +<div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>  uint32_t maxAllocationsToMove,</div> +<div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags) = 0;</div> +<div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>  </div> +<div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved() <span class="keyword">const</span> = 0;</div> +<div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>  </div> +<div class="line"><a name="l07572"></a><span class="lineno"> 7572</span> <span class="keyword">protected</span>:</div> +<div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> <span class="keyword">const</span> m_hAllocator;</div> +<div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>  VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div> +<div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>  <span class="keyword">const</span> uint32_t m_CurrentFrameIndex;</div> +<div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>  </div> +<div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>  <span class="keyword">struct </span>AllocationInfo</div> +<div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>  {</div> +<div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div> +<div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>  VkBool32* m_pChanged;</div> +<div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>  </div> +<div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>  AllocationInfo() :</div> +<div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>  m_hAllocation(VK_NULL_HANDLE),</div> +<div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>  m_pChanged(VMA_NULL)</div> +<div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>  {</div> +<div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>  }</div> +<div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>  AllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) :</div> +<div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>  m_hAllocation(hAlloc),</div> +<div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>  m_pChanged(pChanged)</div> +<div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>  {</div> +<div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>  }</div> +<div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>  };</div> +<div class="line"><a name="l07593"></a><span class="lineno"> 7593</span> };</div> +<div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>  </div> +<div class="line"><a name="l07595"></a><span class="lineno"> 7595</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Generic : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div> +<div class="line"><a name="l07596"></a><span class="lineno"> 7596</span> {</div> +<div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)</div> +<div class="line"><a name="l07598"></a><span class="lineno"> 7598</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>  VmaDefragmentationAlgorithm_Generic(</div> +<div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>  VmaBlockVector* pBlockVector,</div> +<div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>  <span class="keywordtype">bool</span> overlappingMoveSupported);</div> +<div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Generic();</div> <div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>  </div> -<div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>  VkDeviceSize m_MaxCpuBytesToMove;</div> -<div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>  uint32_t m_MaxCpuAllocationsToMove;</div> -<div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>  VkDeviceSize m_MaxGpuBytesToMove;</div> -<div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>  uint32_t m_MaxGpuAllocationsToMove;</div> -<div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>  </div> -<div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>  <span class="comment">// Owner of these objects.</span></div> -<div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>  VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div> -<div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>  <span class="comment">// Owner of these objects.</span></div> -<div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>  VmaVector< VmaBlockVectorDefragmentationContext*, VmaStlAllocator<VmaBlockVectorDefragmentationContext*> > m_CustomPoolContexts;</div> -<div class="line"><a name="l07615"></a><span class="lineno"> 7615</span> };</div> -<div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>  </div> -<div class="line"><a name="l07617"></a><span class="lineno"> 7617</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>  </div> -<div class="line"><a name="l07619"></a><span class="lineno"> 7619</span> <span class="keyword">class </span>VmaRecorder</div> -<div class="line"><a name="l07620"></a><span class="lineno"> 7620</span> {</div> -<div class="line"><a name="l07621"></a><span class="lineno"> 7621</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>  VmaRecorder();</div> -<div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>  VkResult 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="l07624"></a><span class="lineno"> 7624</span>  <span class="keywordtype">void</span> WriteConfiguration(</div> -<div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties& devProps,</div> -<div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties& memProps,</div> -<div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>  uint32_t vulkanApiVersion,</div> -<div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>  <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div> -<div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>  <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div> -<div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>  <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div> -<div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>  <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled);</div> -<div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>  ~VmaRecorder();</div> -<div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>  </div> -<div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>  <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div> -<div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>  <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div> -<div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>  <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div> -<div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> -<div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> -<div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>  <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> -<div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>  <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div> -<div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> -<div class="line"><a name="l07642"></a><span class="lineno"> 7642</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="l07643"></a><span class="lineno"> 7643</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>  <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div> -<div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> -<div class="line"><a name="l07646"></a><span class="lineno"> 7646</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="l07647"></a><span class="lineno"> 7647</span>  uint64_t allocationCount,</div> -<div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>  <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div> -<div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> -<div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> -<div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> -<div class="line"><a name="l07653"></a><span class="lineno"> 7653</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="l07654"></a><span class="lineno"> 7654</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>  <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div> -<div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> -<div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> -<div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> -<div class="line"><a name="l07659"></a><span class="lineno"> 7659</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="l07660"></a><span class="lineno"> 7660</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>  <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div> -<div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>  <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div> -<div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>  uint64_t allocationCount,</div> -<div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>  <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div> -<div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div> -<div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div> -<div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>  <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div> -<div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>  <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div> -<div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>  <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div> -<div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>  <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div> -<div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div> -<div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>  <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div> -<div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div> -<div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>  <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div> -<div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>  <span class="keyword">const</span> VkBufferCreateInfo& bufCreateInfo,</div> -<div class="line"><a name="l07681"></a><span class="lineno"> 7681</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="l07682"></a><span class="lineno"> 7682</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>  <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div> -<div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>  <span class="keyword">const</span> VkImageCreateInfo& imageCreateInfo,</div> -<div class="line"><a name="l07685"></a><span class="lineno"> 7685</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="l07686"></a><span class="lineno"> 7686</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>  <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div> -<div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>  <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div> -<div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>  <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div> -<div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>  <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div> -<div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>  <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div> -<div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> -<div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>  <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div> -<div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div> -<div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div> -<div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>  <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div> -<div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div> -<div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>  <span class="keywordtype">void</span> RecordSetPoolName(uint32_t frameIndex,</div> -<div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div> -<div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* name);</div> -<div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>  </div> -<div class="line"><a name="l07706"></a><span class="lineno"> 7706</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>  <span class="keyword">struct </span>CallParams</div> -<div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>  {</div> -<div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>  uint32_t threadId;</div> -<div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>  <span class="keywordtype">double</span> time;</div> -<div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>  };</div> -<div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>  </div> -<div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>  <span class="keyword">class </span>UserDataString</div> -<div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>  {</div> -<div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>  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="l07717"></a><span class="lineno"> 7717</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div> +<div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div> +<div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> +<div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>  </div> +<div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> +<div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> +<div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>  VkDeviceSize maxBytesToMove,</div> +<div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>  uint32_t maxAllocationsToMove,</div> +<div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> +<div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>  </div> +<div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div> +<div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div> +<div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>  </div> +<div class="line"><a name="l07618"></a><span class="lineno"> 7618</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>  uint32_t m_AllocationCount;</div> +<div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> +<div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>  </div> +<div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>  VkDeviceSize m_BytesMoved;</div> +<div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>  uint32_t m_AllocationsMoved;</div> +<div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>  </div> +<div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>  <span class="keyword">struct </span>AllocationInfoSizeGreater</div> +<div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>  {</div> +<div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo& lhs, <span class="keyword">const</span> AllocationInfo& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l07628"></a><span class="lineno"> 7628</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>  <span class="keywordflow">return</span> lhs.m_hAllocation->GetSize() > rhs.m_hAllocation->GetSize();</div> +<div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>  }</div> +<div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>  };</div> +<div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>  </div> +<div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>  <span class="keyword">struct </span>AllocationInfoOffsetGreater</div> +<div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>  {</div> +<div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo& lhs, <span class="keyword">const</span> AllocationInfo& rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l07636"></a><span class="lineno"> 7636</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>  <span class="keywordflow">return</span> lhs.m_hAllocation->GetOffset() > rhs.m_hAllocation->GetOffset();</div> +<div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>  }</div> +<div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>  };</div> +<div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>  </div> +<div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>  <span class="keyword">struct </span>BlockInfo</div> +<div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>  {</div> +<div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>  <span class="keywordtype">size_t</span> m_OriginalBlockIndex;</div> +<div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>  VmaDeviceMemoryBlock* m_pBlock;</div> +<div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>  <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div> +<div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>  VmaVector< AllocationInfo, VmaStlAllocator<AllocationInfo> > m_Allocations;</div> +<div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>  </div> +<div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>  BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div> +<div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>  m_OriginalBlockIndex(SIZE_MAX),</div> +<div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>  m_pBlock(VMA_NULL),</div> +<div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>  m_HasNonMovableAllocations(true),</div> +<div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>  m_Allocations(pAllocationCallbacks)</div> +<div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>  {</div> +<div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>  }</div> +<div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>  </div> +<div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>  <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div> +<div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>  {</div> +<div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock->m_pMetadata->GetAllocationCount();</div> +<div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div> +<div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>  m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div> +<div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>  }</div> +<div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>  </div> +<div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>  <span class="keywordtype">void</span> SortAllocationsBySizeDescending()</div> +<div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>  {</div> +<div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>  VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div> +<div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>  }</div> +<div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>  </div> +<div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>  <span class="keywordtype">void</span> SortAllocationsByOffsetDescending()</div> +<div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>  {</div> +<div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>  VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoOffsetGreater());</div> +<div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>  }</div> +<div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>  };</div> +<div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>  </div> +<div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>  <span class="keyword">struct </span>BlockPointerLess</div> +<div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>  {</div> +<div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div> +<div class="line"><a name="l07677"></a><span class="lineno"> 7677</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>  <span class="keywordflow">return</span> pLhsBlockInfo->m_pBlock < pRhsBlock;</div> +<div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>  }</div> +<div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div> +<div class="line"><a name="l07681"></a><span class="lineno"> 7681</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>  <span class="keywordflow">return</span> pLhsBlockInfo->m_pBlock < pRhsBlockInfo->m_pBlock;</div> +<div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>  }</div> +<div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>  };</div> +<div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>  </div> +<div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>  <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div> +<div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>  <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div> +<div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>  <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div> +<div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>  {</div> +<div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div> +<div class="line"><a name="l07691"></a><span class="lineno"> 7691</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>  <span class="keywordflow">if</span>(pLhsBlockInfo->m_HasNonMovableAllocations && !pRhsBlockInfo->m_HasNonMovableAllocations)</div> +<div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>  {</div> +<div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>  }</div> +<div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>  <span class="keywordflow">if</span>(!pLhsBlockInfo->m_HasNonMovableAllocations && pRhsBlockInfo->m_HasNonMovableAllocations)</div> +<div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>  {</div> +<div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>  }</div> +<div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>  <span class="keywordflow">if</span>(pLhsBlockInfo->m_pBlock->m_pMetadata->GetSumFreeSize() < pRhsBlockInfo->m_pBlock->m_pMetadata->GetSumFreeSize())</div> +<div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>  {</div> +<div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>  }</div> +<div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>  }</div> +<div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>  };</div> +<div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>  </div> +<div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>  <span class="keyword">typedef</span> VmaVector< BlockInfo*, VmaStlAllocator<BlockInfo*> > BlockInfoVector;</div> +<div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>  BlockInfoVector m_Blocks;</div> +<div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>  </div> +<div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>  VkResult DefragmentRound(</div> +<div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> +<div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>  VkDeviceSize maxBytesToMove,</div> +<div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>  uint32_t maxAllocationsToMove,</div> +<div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>  <span class="keywordtype">bool</span> freeOldAllocations);</div> +<div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>  </div> +<div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>  <span class="keywordtype">size_t</span> CalcBlocksWithNonMovableCount() <span class="keyword">const</span>;</div> <div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>  </div> -<div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>  <span class="keywordtype">char</span> m_PtrStr[17];</div> -<div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div> -<div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>  };</div> +<div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div> +<div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>  <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div> +<div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>  <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div> +<div class="line"><a name="l07722"></a><span class="lineno"> 7722</span> };</div> <div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>  </div> -<div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>  <span class="keywordtype">bool</span> m_UseMutex;</div> -<div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>  <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div> -<div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>  FILE* m_File;</div> -<div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>  VMA_MUTEX m_FileMutex;</div> -<div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>  std::chrono::time_point<std::chrono::high_resolution_clock> m_RecordingStartTime;</div> -<div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>  </div> -<div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>  <span class="keywordtype">void</span> GetBasicParams(CallParams& outParams);</div> -<div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>  </div> -<div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>  <span class="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div> -<div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>  <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</div> -<div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>  {</div> -<div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>  <span class="keywordflow">if</span>(count)</div> -<div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>  {</div> -<div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>  fprintf(m_File, <span class="stringliteral">"%p"</span>, pItems[0]);</div> -<div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>  <span class="keywordflow">for</span>(uint64_t i = 1; i < count; ++i)</div> -<div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>  {</div> -<div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>  fprintf(m_File, <span class="stringliteral">" %p"</span>, pItems[i]);</div> -<div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>  }</div> -<div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>  }</div> -<div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>  }</div> -<div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>  </div> -<div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>  <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div> -<div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>  <span class="keywordtype">void</span> Flush();</div> -<div class="line"><a name="l07748"></a><span class="lineno"> 7748</span> };</div> -<div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>  </div> -<div class="line"><a name="l07750"></a><span class="lineno"> 7750</span> <span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>  </div> -<div class="line"><a name="l07752"></a><span class="lineno"> 7752</span> <span class="comment">/*</span></div> -<div class="line"><a name="l07753"></a><span class="lineno"> 7753</span> <span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div> -<div class="line"><a name="l07754"></a><span class="lineno"> 7754</span> <span class="comment">*/</span></div> -<div class="line"><a name="l07755"></a><span class="lineno"> 7755</span> <span class="keyword">class </span>VmaAllocationObjectAllocator</div> -<div class="line"><a name="l07756"></a><span class="lineno"> 7756</span> {</div> -<div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>  VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div> -<div class="line"><a name="l07758"></a><span class="lineno"> 7758</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>  VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div> -<div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>  </div> -<div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>  <span class="keyword">template</span><<span class="keyword">typename</span>... Types> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate(Types... args);</div> -<div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>  <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div> -<div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>  </div> -<div class="line"><a name="l07764"></a><span class="lineno"> 7764</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>  VMA_MUTEX m_Mutex;</div> -<div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>  VmaPoolAllocator<VmaAllocation_T> m_Allocator;</div> -<div class="line"><a name="l07767"></a><span class="lineno"> 7767</span> };</div> -<div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>  </div> -<div class="line"><a name="l07769"></a><span class="lineno"> 7769</span> <span class="keyword">struct </span>VmaCurrentBudgetData</div> -<div class="line"><a name="l07770"></a><span class="lineno"> 7770</span> {</div> -<div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>  VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>  VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>  </div> -<div class="line"><a name="l07774"></a><span class="lineno"> 7774</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>  VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;</div> -<div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>  VMA_RW_MUTEX m_BudgetMutex;</div> -<div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>  uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>  uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>  uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];</div> -<div class="line"><a name="l07780"></a><span class="lineno"> 7780</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>  </div> -<div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>  VmaCurrentBudgetData()</div> -<div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>  {</div> -<div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < VK_MAX_MEMORY_HEAPS; ++heapIndex)</div> -<div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>  {</div> -<div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>  m_BlockBytes[heapIndex] = 0;</div> -<div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>  m_AllocationBytes[heapIndex] = 0;</div> -<div class="line"><a name="l07788"></a><span class="lineno"> 7788</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>  m_VulkanUsage[heapIndex] = 0;</div> -<div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>  m_VulkanBudget[heapIndex] = 0;</div> -<div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>  m_BlockBytesAtBudgetFetch[heapIndex] = 0;</div> -<div class="line"><a name="l07792"></a><span class="lineno"> 7792</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>  }</div> -<div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>  </div> -<div class="line"><a name="l07795"></a><span class="lineno"> 7795</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>  m_OperationsSinceBudgetFetch = 0;</div> -<div class="line"><a name="l07797"></a><span class="lineno"> 7797</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>  }</div> -<div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>  </div> -<div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>  <span class="keywordtype">void</span> AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div> -<div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>  {</div> -<div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>  m_AllocationBytes[heapIndex] += allocationSize;</div> -<div class="line"><a name="l07803"></a><span class="lineno"> 7803</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>  ++m_OperationsSinceBudgetFetch;</div> -<div class="line"><a name="l07805"></a><span class="lineno"> 7805</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>  }</div> -<div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>  </div> -<div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>  <span class="keywordtype">void</span> RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div> -<div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>  {</div> -<div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>  VMA_ASSERT(m_AllocationBytes[heapIndex] >= allocationSize); <span class="comment">// DELME</span></div> -<div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>  m_AllocationBytes[heapIndex] -= allocationSize;</div> -<div class="line"><a name="l07812"></a><span class="lineno"> 7812</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>  ++m_OperationsSinceBudgetFetch;</div> -<div class="line"><a name="l07814"></a><span class="lineno"> 7814</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>  }</div> -<div class="line"><a name="l07816"></a><span class="lineno"> 7816</span> };</div> -<div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>  </div> -<div class="line"><a name="l07818"></a><span class="lineno"> 7818</span> <span class="comment">// Main allocator object.</span></div> -<div class="line"><a name="l07819"></a><span class="lineno"> 7819</span> <span class="keyword">struct </span>VmaAllocator_T</div> -<div class="line"><a name="l07820"></a><span class="lineno"> 7820</span> {</div> -<div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>  VMA_CLASS_NO_COPY(VmaAllocator_T)</div> -<div class="line"><a name="l07822"></a><span class="lineno"> 7822</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>  <span class="keywordtype">bool</span> m_UseMutex;</div> -<div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>  uint32_t m_VulkanApiVersion;</div> -<div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>  <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation; <span class="comment">// Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).</span></div> -<div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>  <span class="keywordtype">bool</span> m_UseKhrBindMemory2; <span class="comment">// Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).</span></div> -<div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>  <span class="keywordtype">bool</span> m_UseExtMemoryBudget;</div> -<div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>  <span class="keywordtype">bool</span> m_UseAmdDeviceCoherentMemory;</div> -<div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>  <span class="keywordtype">bool</span> m_UseKhrBufferDeviceAddress;</div> -<div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>  VkDevice m_hDevice;</div> -<div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>  VkInstance m_hInstance;</div> -<div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>  <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div> -<div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>  VkAllocationCallbacks m_AllocationCallbacks;</div> -<div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>  <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div> -<div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>  VmaAllocationObjectAllocator m_AllocationObjectAllocator;</div> -<div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>  </div> -<div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>  <span class="comment">// Each bit (1 << i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.</span></div> -<div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>  uint32_t m_HeapSizeLimitMask;</div> -<div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>  </div> -<div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>  VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div> -<div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>  VkPhysicalDeviceMemoryProperties m_MemProps;</div> -<div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>  </div> -<div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>  <span class="comment">// Default pools.</span></div> -<div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>  VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div> -<div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>  </div> -<div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>  <span class="comment">// Each vector is sorted by memory (handle value).</span></div> -<div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>  <span class="keyword">typedef</span> VmaVector< VmaAllocation, VmaStlAllocator<VmaAllocation> > AllocationVectorType;</div> -<div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>  AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div> -<div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>  VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div> -<div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>  </div> -<div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>  VmaCurrentBudgetData m_Budget;</div> -<div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>  </div> -<div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>  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="l07854"></a><span class="lineno"> 7854</span>  VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div> -<div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>  ~VmaAllocator_T();</div> -<div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>  </div> -<div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>  <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div> -<div class="line"><a name="l07858"></a><span class="lineno"> 7858</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>  <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : 0;</div> -<div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>  }</div> -<div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>& GetVulkanFunctions()<span class="keyword"> const</span></div> -<div class="line"><a name="l07862"></a><span class="lineno"> 7862</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>  <span class="keywordflow">return</span> m_VulkanFunctions;</div> -<div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>  }</div> +<div class="line"><a name="l07724"></a><span class="lineno"> 7724</span> <span class="keyword">class </span>VmaDefragmentationAlgorithm_Fast : <span class="keyword">public</span> VmaDefragmentationAlgorithm</div> +<div class="line"><a name="l07725"></a><span class="lineno"> 7725</span> {</div> +<div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>  VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Fast)</div> +<div class="line"><a name="l07727"></a><span class="lineno"> 7727</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>  VmaDefragmentationAlgorithm_Fast(</div> +<div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>  VmaBlockVector* pBlockVector,</div> +<div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>  <span class="keywordtype">bool</span> overlappingMoveSupported);</div> +<div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>  <span class="keyword">virtual</span> ~VmaDefragmentationAlgorithm_Fast();</div> +<div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>  </div> +<div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged) { ++m_AllocationCount; }</div> +<div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> +<div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>  </div> +<div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>  <span class="keyword">virtual</span> VkResult Defragment(</div> +<div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,</div> +<div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>  VkDeviceSize maxBytesToMove,</div> +<div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>  uint32_t maxAllocationsToMove,</div> +<div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>  <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> +<div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>  </div> +<div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>  <span class="keyword">virtual</span> VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div> +<div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>  <span class="keyword">virtual</span> uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div> +<div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>  </div> +<div class="line"><a name="l07747"></a><span class="lineno"> 7747</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>  <span class="keyword">struct </span>BlockInfo</div> +<div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>  {</div> +<div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>  <span class="keywordtype">size_t</span> origBlockIndex;</div> +<div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>  };</div> +<div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>  </div> +<div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>  <span class="keyword">class </span>FreeSpaceDatabase</div> +<div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>  {</div> +<div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>  FreeSpaceDatabase()</div> +<div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>  {</div> +<div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>  FreeSpace s = {};</div> +<div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>  s.blockInfoIndex = SIZE_MAX;</div> +<div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> +<div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>  {</div> +<div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>  m_FreeSpaces[i] = s;</div> +<div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>  }</div> +<div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>  }</div> +<div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>  </div> +<div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>  <span class="keywordtype">void</span> Register(<span class="keywordtype">size_t</span> blockInfoIndex, VkDeviceSize offset, VkDeviceSize size)</div> +<div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>  {</div> +<div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>  <span class="keywordflow">if</span>(size < VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> +<div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>  {</div> +<div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>  }</div> +<div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>  </div> +<div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>  <span class="comment">// Find first invalid or the smallest structure.</span></div> +<div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>  <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div> +<div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> +<div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>  {</div> +<div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>  <span class="comment">// Empty structure.</span></div> +<div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex == SIZE_MAX)</div> +<div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>  {</div> +<div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>  bestIndex = i;</div> +<div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>  }</div> +<div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].size < size &&</div> +<div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>  (bestIndex == SIZE_MAX || m_FreeSpaces[bestIndex].size > m_FreeSpaces[i].size))</div> +<div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>  {</div> +<div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>  bestIndex = i;</div> +<div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>  }</div> +<div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>  }</div> +<div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>  </div> +<div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>  <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div> +<div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>  {</div> +<div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>  m_FreeSpaces[bestIndex].blockInfoIndex = blockInfoIndex;</div> +<div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>  m_FreeSpaces[bestIndex].offset = offset;</div> +<div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>  m_FreeSpaces[bestIndex].size = size;</div> +<div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>  }</div> +<div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>  }</div> +<div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>  </div> +<div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>  <span class="keywordtype">bool</span> Fetch(VkDeviceSize alignment, VkDeviceSize size,</div> +<div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>  <span class="keywordtype">size_t</span>& outBlockInfoIndex, VkDeviceSize& outDstOffset)</div> +<div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>  {</div> +<div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>  <span class="keywordtype">size_t</span> bestIndex = SIZE_MAX;</div> +<div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>  VkDeviceSize bestFreeSpaceAfter = 0;</div> +<div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < MAX_COUNT; ++i)</div> +<div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>  {</div> +<div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>  <span class="comment">// Structure is valid.</span></div> +<div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>  <span class="keywordflow">if</span>(m_FreeSpaces[i].blockInfoIndex != SIZE_MAX)</div> +<div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>  {</div> +<div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>  <span class="keyword">const</span> VkDeviceSize dstOffset = VmaAlignUp(m_FreeSpaces[i].offset, alignment);</div> +<div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>  <span class="comment">// Allocation fits into this structure.</span></div> +<div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>  <span class="keywordflow">if</span>(dstOffset + size <= m_FreeSpaces[i].offset + m_FreeSpaces[i].size)</div> +<div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>  {</div> +<div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>  <span class="keyword">const</span> VkDeviceSize freeSpaceAfter = (m_FreeSpaces[i].offset + m_FreeSpaces[i].size) -</div> +<div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>  (dstOffset + size);</div> +<div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>  <span class="keywordflow">if</span>(bestIndex == SIZE_MAX || freeSpaceAfter > bestFreeSpaceAfter)</div> +<div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>  {</div> +<div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>  bestIndex = i;</div> +<div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>  bestFreeSpaceAfter = freeSpaceAfter;</div> +<div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>  }</div> +<div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>  }</div> +<div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>  }</div> +<div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>  }</div> +<div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>  </div> +<div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>  <span class="keywordflow">if</span>(bestIndex != SIZE_MAX)</div> +<div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>  {</div> +<div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>  outBlockInfoIndex = m_FreeSpaces[bestIndex].blockInfoIndex;</div> +<div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>  outDstOffset = VmaAlignUp(m_FreeSpaces[bestIndex].offset, alignment);</div> +<div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>  </div> +<div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>  <span class="keywordflow">if</span>(bestFreeSpaceAfter >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> +<div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>  {</div> +<div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>  <span class="comment">// Leave this structure for remaining empty space.</span></div> +<div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>  <span class="keyword">const</span> VkDeviceSize alignmentPlusSize = (outDstOffset - m_FreeSpaces[bestIndex].offset) + size;</div> +<div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>  m_FreeSpaces[bestIndex].offset += alignmentPlusSize;</div> +<div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>  m_FreeSpaces[bestIndex].size -= alignmentPlusSize;</div> +<div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>  }</div> +<div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>  {</div> +<div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>  <span class="comment">// This structure becomes invalid.</span></div> +<div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>  m_FreeSpaces[bestIndex].blockInfoIndex = SIZE_MAX;</div> +<div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>  }</div> +<div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>  </div> +<div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>  }</div> +<div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>  </div> +<div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>  }</div> +<div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>  </div> +<div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_COUNT = 4;</div> +<div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>  </div> +<div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>  <span class="keyword">struct </span>FreeSpace</div> +<div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>  {</div> +<div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>  <span class="keywordtype">size_t</span> blockInfoIndex; <span class="comment">// SIZE_MAX means this structure is invalid.</span></div> +<div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>  VkDeviceSize offset;</div> +<div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>  VkDeviceSize size;</div> +<div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>  } m_FreeSpaces[MAX_COUNT];</div> +<div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>  };</div> +<div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>  </div> +<div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> m_OverlappingMoveSupported;</div> +<div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>  </div> +<div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>  uint32_t m_AllocationCount;</div> +<div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> +<div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>  </div> +<div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>  VkDeviceSize m_BytesMoved;</div> +<div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>  uint32_t m_AllocationsMoved;</div> <div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>  </div> -<div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>  VkPhysicalDevice GetPhysicalDevice()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PhysicalDevice; }</div> +<div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>  VmaVector< BlockInfo, VmaStlAllocator<BlockInfo> > m_BlockInfos;</div> <div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>  </div> -<div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>  VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div> -<div class="line"><a name="l07869"></a><span class="lineno"> 7869</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>  <span class="keywordflow">return</span> VMA_MAX(</div> -<div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>  <span class="keyword">static_cast<</span>VkDeviceSize<span class="keyword">></span>(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div> -<div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>  m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div> -<div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>  }</div> -<div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>  </div> -<div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>  uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div> -<div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>  uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div> -<div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>  </div> -<div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>  uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div> -<div class="line"><a name="l07879"></a><span class="lineno"> 7879</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>  VMA_ASSERT(memTypeIndex < m_MemProps.memoryTypeCount);</div> -<div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>  <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div> -<div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>  }</div> -<div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>  <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div> -<div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>  <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div> -<div class="line"><a name="l07885"></a><span class="lineno"> 7885</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>  <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div> -<div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div> -<div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>  }</div> -<div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>  <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div> -<div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>  VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div> -<div class="line"><a name="l07891"></a><span class="lineno"> 7891</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>  <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div> -<div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>  VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div> -<div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>  (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</div> -<div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>  }</div> -<div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>  </div> -<div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>  <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div> -<div class="line"><a name="l07898"></a><span class="lineno"> 7898</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>  <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div> -<div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>  }</div> +<div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>  <span class="keywordtype">void</span> PreprocessMetadata();</div> +<div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>  <span class="keywordtype">void</span> PostprocessMetadata();</div> +<div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>  <span class="keywordtype">void</span> InsertSuballoc(VmaBlockMetadata_Generic* pMetadata, <span class="keyword">const</span> VmaSuballocation& suballoc);</div> +<div class="line"><a name="l07871"></a><span class="lineno"> 7871</span> };</div> +<div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>  </div> +<div class="line"><a name="l07873"></a><span class="lineno"> 7873</span> <span class="keyword">struct </span>VmaBlockDefragmentationContext</div> +<div class="line"><a name="l07874"></a><span class="lineno"> 7874</span> {</div> +<div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>  <span class="keyword">enum</span> BLOCK_FLAG</div> +<div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>  {</div> +<div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>  BLOCK_FLAG_USED = 0x00000001,</div> +<div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>  };</div> +<div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>  uint32_t flags;</div> +<div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>  VkBuffer hBuffer;</div> +<div class="line"><a name="l07881"></a><span class="lineno"> 7881</span> };</div> +<div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>  </div> +<div class="line"><a name="l07883"></a><span class="lineno"> 7883</span> <span class="keyword">class </span>VmaBlockVectorDefragmentationContext</div> +<div class="line"><a name="l07884"></a><span class="lineno"> 7884</span> {</div> +<div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>  VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)</div> +<div class="line"><a name="l07886"></a><span class="lineno"> 7886</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>  VkResult res;</div> +<div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>  <span class="keywordtype">bool</span> mutexLocked;</div> +<div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>  VmaVector< VmaBlockDefragmentationContext, VmaStlAllocator<VmaBlockDefragmentationContext> > blockContexts;</div> +<div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>  VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> > defragmentationMoves;</div> +<div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>  uint32_t defragmentationMovesProcessed;</div> +<div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>  uint32_t defragmentationMovesCommitted;</div> +<div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>  <span class="keywordtype">bool</span> hasDefragmentationPlan;</div> +<div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>  </div> +<div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>  VmaBlockVectorDefragmentationContext(</div> +<div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hCustomPool, <span class="comment">// Optional.</span></div> +<div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>  VmaBlockVector* pBlockVector,</div> +<div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>  uint32_t currFrameIndex);</div> +<div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>  ~VmaBlockVectorDefragmentationContext();</div> <div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>  </div> -<div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>  uint32_t GetGlobalMemoryTypeBits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_GlobalMemoryTypeBits; }</div> -<div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>  </div> -<div class="line"><a name="l07904"></a><span class="lineno"> 7904</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>  VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div> -<div class="line"><a name="l07906"></a><span class="lineno"> 7906</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>  </div> -<div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>  <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div> -<div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>  VkBuffer hBuffer,</div> -<div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>  VkMemoryRequirements& memReq,</div> -<div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div> -<div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation) <span class="keyword">const</span>;</div> -<div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>  <span class="keywordtype">void</span> GetImageMemoryRequirements(</div> -<div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>  VkImage hImage,</div> -<div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>  VkMemoryRequirements& memReq,</div> -<div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div> -<div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation) <span class="keyword">const</span>;</div> -<div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>  </div> -<div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>  <span class="comment">// Main allocation function.</span></div> -<div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>  VkResult AllocateMemory(</div> -<div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> -<div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> -<div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> -<div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>  VkBuffer dedicatedBuffer,</div> -<div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>  VkBufferUsageFlags dedicatedBufferUsage, <span class="comment">// UINT32_MAX when unknown.</span></div> -<div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>  VkImage dedicatedImage,</div> -<div class="line"><a name="l07927"></a><span class="lineno"> 7927</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="l07928"></a><span class="lineno"> 7928</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>  </div> -<div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>  <span class="comment">// Main deallocation function.</span></div> -<div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>  <span class="keywordtype">void</span> FreeMemory(</div> -<div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>  </div> -<div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>  VkResult ResizeAllocation(</div> -<div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div> -<div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>  VkDeviceSize newSize);</div> -<div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>  </div> -<div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>  <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div> +<div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> GetCustomPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hCustomPool; }</div> +<div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>  VmaBlockVector* GetBlockVector()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBlockVector; }</div> +<div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>  VmaDefragmentationAlgorithm* GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAlgorithm; }</div> +<div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>  </div> +<div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>  <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div> +<div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>  <span class="keywordtype">void</span> AddAll() { m_AllAllocations = <span class="keyword">true</span>; }</div> +<div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>  </div> +<div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>  <span class="keywordtype">void</span> Begin(<span class="keywordtype">bool</span> overlappingMoveSupported, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> +<div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>  </div> +<div class="line"><a name="l07911"></a><span class="lineno"> 7911</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> +<div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>  <span class="comment">// Null if not from custom pool.</span></div> +<div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hCustomPool;</div> +<div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>  <span class="comment">// Redundant, for convenience not to fetch from m_hCustomPool->m_BlockVector or m_hAllocator->m_pBlockVectors.</span></div> +<div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>  VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div> +<div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>  <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div> +<div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>  <span class="comment">// Owner of this object.</span></div> +<div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>  VmaDefragmentationAlgorithm* m_pAlgorithm;</div> +<div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>  </div> +<div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>  <span class="keyword">struct </span>AllocInfo</div> +<div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>  {</div> +<div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc;</div> +<div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>  VkBool32* pChanged;</div> +<div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>  };</div> +<div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>  <span class="comment">// Used between constructor and Begin.</span></div> +<div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>  VmaVector< AllocInfo, VmaStlAllocator<AllocInfo> > m_Allocations;</div> +<div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>  <span class="keywordtype">bool</span> m_AllAllocations;</div> +<div class="line"><a name="l07929"></a><span class="lineno"> 7929</span> };</div> +<div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>  </div> +<div class="line"><a name="l07931"></a><span class="lineno"> 7931</span> <span class="keyword">struct </span>VmaDefragmentationContext_T</div> +<div class="line"><a name="l07932"></a><span class="lineno"> 7932</span> {</div> +<div class="line"><a name="l07933"></a><span class="lineno"> 7933</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>  VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)</div> +<div class="line"><a name="l07935"></a><span class="lineno"> 7935</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>  VmaDefragmentationContext_T(</div> +<div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>  uint32_t currFrameIndex,</div> +<div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>  uint32_t flags,</div> +<div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats);</div> +<div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>  ~VmaDefragmentationContext_T();</div> <div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>  </div> -<div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>  <span class="keywordtype">void</span> GetBudget(</div> -<div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount);</div> -<div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>  </div> -<div class="line"><a name="l07946"></a><span class="lineno"> 7946</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>  <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json);</div> -<div class="line"><a name="l07948"></a><span class="lineno"> 7948</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>  </div> -<div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>  VkResult DefragmentationBegin(</div> -<div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div> -<div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div> -<div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div> -<div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>  VkResult DefragmentationEnd(</div> -<div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> -<div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>  </div> -<div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>  VkResult DefragmentationPassBegin(</div> -<div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>  <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div> -<div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> -<div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>  VkResult DefragmentationPassEnd(</div> -<div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> +<div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>  <span class="keywordtype">void</span> AddPools(uint32_t poolCount, <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPools);</div> +<div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>  <span class="keywordtype">void</span> AddAllocations(</div> +<div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>  uint32_t allocationCount,</div> +<div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div> +<div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>  VkBool32* pAllocationsChanged);</div> +<div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>  </div> +<div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l07950"></a><span class="lineno"> 7950</span> <span class="comment"> Returns:</span></div> +<div class="line"><a name="l07951"></a><span class="lineno"> 7951</span> <span class="comment"> - `VK_SUCCESS` if succeeded and object can be destroyed immediately.</span></div> +<div class="line"><a name="l07952"></a><span class="lineno"> 7952</span> <span class="comment"> - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().</span></div> +<div class="line"><a name="l07953"></a><span class="lineno"> 7953</span> <span class="comment"> - Negative value if error occurred and object can be destroyed immediately.</span></div> +<div class="line"><a name="l07954"></a><span class="lineno"> 7954</span> <span class="comment"> */</span></div> +<div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>  VkResult Defragment(</div> +<div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>  VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,</div> +<div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>  VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,</div> +<div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>  VkCommandBuffer commandBuffer, <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats, <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> flags);</div> +<div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>  </div> +<div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>  VkResult DefragmentPassBegin(<a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo);</div> +<div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>  VkResult DefragmentPassEnd();</div> <div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>  </div> -<div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>  <span class="keywordtype">void</span> GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div> -<div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>  <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>  </div> -<div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>  VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div> -<div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>  <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> -<div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>  <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div> -<div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>  </div> -<div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>  <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div> -<div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>  uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div> -<div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>  </div> -<div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>  <span class="keywordtype">void</span> MakePoolAllocationsLost(</div> -<div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div> -<div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount);</div> -<div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>  VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div> -<div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>  VkResult CheckCorruption(uint32_t memoryTypeBits);</div> -<div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>  </div> -<div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>  <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> -<div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>  </div> -<div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>  <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div> -<div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>  VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div> -<div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>  <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div> -<div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>  <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div> -<div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>  <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div> -<div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>  VkResult BindVulkanBuffer(</div> -<div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>  VkDeviceMemory memory,</div> -<div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>  VkDeviceSize memoryOffset,</div> -<div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>  VkBuffer buffer,</div> -<div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>  <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div> -<div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>  VkResult BindVulkanImage(</div> -<div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>  VkDeviceMemory memory,</div> -<div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>  VkDeviceSize memoryOffset,</div> -<div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>  VkImage image,</div> -<div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>  </div> -<div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>  VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div> -<div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>  <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> -<div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>  </div> -<div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>  VkResult BindBufferMemory(</div> -<div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>  VkBuffer hBuffer,</div> -<div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>  VkResult BindImageMemory(</div> -<div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>  VkImage hImage,</div> -<div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> -<div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>  </div> -<div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>  VkResult FlushOrInvalidateAllocation(</div> -<div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>  VkDeviceSize offset, VkDeviceSize size,</div> -<div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>  VMA_CACHE_OPERATION op);</div> -<div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>  VkResult FlushOrInvalidateAllocations(</div> -<div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>  uint32_t allocationCount,</div> -<div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div> -<div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>  <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div> -<div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>  VMA_CACHE_OPERATION op);</div> -<div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>  </div> -<div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>  <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</div> -<div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>  </div> -<div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l08025"></a><span class="lineno"> 8025</span> <span class="comment"> Returns bit mask of memory types that can support defragmentation on GPU as</span></div> -<div class="line"><a name="l08026"></a><span class="lineno"> 8026</span> <span class="comment"> they support creation of required buffer for copy operations.</span></div> -<div class="line"><a name="l08027"></a><span class="lineno"> 8027</span> <span class="comment"> */</span></div> -<div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>  uint32_t GetGpuDefragmentationMemoryTypeBits();</div> -<div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>  </div> -<div class="line"><a name="l08030"></a><span class="lineno"> 8030</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>  VkDeviceSize m_PreferredLargeHeapBlockSize;</div> -<div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>  </div> -<div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>  VkPhysicalDevice m_PhysicalDevice;</div> -<div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>  VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div> -<div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>  VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></div> -<div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>  </div> -<div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>  VMA_RW_MUTEX m_PoolsMutex;</div> -<div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>  <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div> -<div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>  VmaVector<VmaPool, VmaStlAllocator<VmaPool> > m_Pools;</div> -<div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>  uint32_t m_NextPoolId;</div> -<div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>  </div> -<div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>  <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div> -<div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>  </div> -<div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>  <span class="comment">// Global bit mask AND-ed with any memoryTypeBits to disallow certain memory types.</span></div> -<div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>  uint32_t m_GlobalMemoryTypeBits;</div> -<div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>  </div> -<div class="line"><a name="l08047"></a><span class="lineno"> 8047</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> -<div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>  VmaRecorder* m_pRecorder;</div> -<div class="line"><a name="l08049"></a><span class="lineno"> 8049</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>  </div> -<div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>  <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div> -<div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>  </div> -<div class="line"><a name="l08053"></a><span class="lineno"> 8053</span> <span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div> -<div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Static();</div> -<div class="line"><a name="l08055"></a><span class="lineno"> 8055</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>  </div> -<div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div> -<div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>  </div> -<div class="line"><a name="l08059"></a><span class="lineno"> 8059</span> <span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div> -<div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Dynamic();</div> -<div class="line"><a name="l08061"></a><span class="lineno"> 8061</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>  </div> -<div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>  <span class="keywordtype">void</span> ValidateVulkanFunctions();</div> -<div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>  </div> -<div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>  VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div> -<div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>  </div> -<div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>  VkResult AllocateMemoryOfType(</div> -<div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>  VkDeviceSize size,</div> -<div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>  <span class="keywordtype">bool</span> dedicatedAllocation,</div> -<div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>  VkBuffer dedicatedBuffer,</div> -<div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>  VkBufferUsageFlags dedicatedBufferUsage,</div> -<div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>  VkImage dedicatedImage,</div> -<div class="line"><a name="l08074"></a><span class="lineno"> 8074</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="l08075"></a><span class="lineno"> 8075</span>  uint32_t memTypeIndex,</div> -<div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>  </div> -<div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>  <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div> -<div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>  VkResult AllocateDedicatedMemoryPage(</div> -<div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>  VkDeviceSize size,</div> -<div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>  uint32_t memTypeIndex,</div> -<div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>  <span class="keyword">const</span> VkMemoryAllocateInfo& allocInfo,</div> -<div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>  <span class="keywordtype">bool</span> map,</div> -<div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>  <span class="keywordtype">bool</span> isUserDataString,</div> -<div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>  <span class="keywordtype">void</span>* pUserData,</div> -<div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> -<div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>  </div> -<div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>  <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div> -<div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>  VkResult AllocateDedicatedMemory(</div> -<div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>  VkDeviceSize size,</div> -<div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>  uint32_t memTypeIndex,</div> -<div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>  <span class="keywordtype">bool</span> withinBudget,</div> -<div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>  <span class="keywordtype">bool</span> map,</div> -<div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>  <span class="keywordtype">bool</span> isUserDataString,</div> -<div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>  <span class="keywordtype">void</span>* pUserData,</div> -<div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>  VkBuffer dedicatedBuffer,</div> -<div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>  VkBufferUsageFlags dedicatedBufferUsage,</div> -<div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>  VkImage dedicatedImage,</div> -<div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> -<div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>  </div> -<div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>  <span class="keywordtype">void</span> FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> -<div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>  </div> -<div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l08109"></a><span class="lineno"> 8109</span> <span class="comment"> Calculates and returns bit mask of memory types that can support defragmentation</span></div> -<div class="line"><a name="l08110"></a><span class="lineno"> 8110</span> <span class="comment"> on GPU as they support creation of required buffer for copy operations.</span></div> -<div class="line"><a name="l08111"></a><span class="lineno"> 8111</span> <span class="comment"> */</span></div> -<div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>  uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div> -<div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>  </div> -<div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>  uint32_t CalculateGlobalMemoryTypeBits() <span class="keyword">const</span>;</div> -<div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>  </div> -<div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>  <span class="keywordtype">bool</span> GetFlushOrInvalidateRange(</div> -<div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div> -<div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>  VkDeviceSize offset, VkDeviceSize size,</div> -<div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>  VkMappedMemoryRange& outRange) <span class="keyword">const</span>;</div> -<div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>  </div> -<div class="line"><a name="l08121"></a><span class="lineno"> 8121</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>  <span class="keywordtype">void</span> UpdateVulkanBudget();</div> -<div class="line"><a name="l08123"></a><span class="lineno"> 8123</span> <span class="preprocessor">#endif // #if VMA_MEMORY_BUDGET</span></div> -<div class="line"><a name="l08124"></a><span class="lineno"> 8124</span> };</div> -<div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>  </div> -<div class="line"><a name="l08127"></a><span class="lineno"> 8127</span> <span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div> -<div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>  </div> -<div class="line"><a name="l08129"></a><span class="lineno"> 8129</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div> -<div class="line"><a name="l08130"></a><span class="lineno"> 8130</span> {</div> -<div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>  <span class="keywordflow">return</span> VmaMalloc(&hAllocator->m_AllocationCallbacks, size, alignment);</div> -<div class="line"><a name="l08132"></a><span class="lineno"> 8132</span> }</div> -<div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>  </div> -<div class="line"><a name="l08134"></a><span class="lineno"> 8134</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l08135"></a><span class="lineno"> 8135</span> {</div> -<div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>  VmaFree(&hAllocator->m_AllocationCallbacks, ptr);</div> -<div class="line"><a name="l08137"></a><span class="lineno"> 8137</span> }</div> -<div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>  </div> -<div class="line"><a name="l08139"></a><span class="lineno"> 8139</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l08140"></a><span class="lineno"> 8140</span> <span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> -<div class="line"><a name="l08141"></a><span class="lineno"> 8141</span> {</div> -<div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div> -<div class="line"><a name="l08143"></a><span class="lineno"> 8143</span> }</div> +<div class="line"><a name="l07963"></a><span class="lineno"> 7963</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div> +<div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>  <span class="keyword">const</span> uint32_t m_CurrFrameIndex;</div> +<div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>  <span class="keyword">const</span> uint32_t m_Flags;</div> +<div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* <span class="keyword">const</span> m_pStats;</div> +<div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>  </div> +<div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>  VkDeviceSize m_MaxCpuBytesToMove;</div> +<div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>  uint32_t m_MaxCpuAllocationsToMove;</div> +<div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>  VkDeviceSize m_MaxGpuBytesToMove;</div> +<div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>  uint32_t m_MaxGpuAllocationsToMove;</div> +<div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>  </div> +<div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>  <span class="comment">// Owner of these objects.</span></div> +<div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>  VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];</div> +<div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>  <span class="comment">// Owner of these objects.</span></div> +<div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>  VmaVector< VmaBlockVectorDefragmentationContext*, VmaStlAllocator<VmaBlockVectorDefragmentationContext*> > m_CustomPoolContexts;</div> +<div class="line"><a name="l07978"></a><span class="lineno"> 7978</span> };</div> +<div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>  </div> +<div class="line"><a name="l07980"></a><span class="lineno"> 7980</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>  </div> +<div class="line"><a name="l07982"></a><span class="lineno"> 7982</span> <span class="keyword">class </span>VmaRecorder</div> +<div class="line"><a name="l07983"></a><span class="lineno"> 7983</span> {</div> +<div class="line"><a name="l07984"></a><span class="lineno"> 7984</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>  VmaRecorder();</div> +<div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>  VkResult 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="l07987"></a><span class="lineno"> 7987</span>  <span class="keywordtype">void</span> WriteConfiguration(</div> +<div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>  <span class="keyword">const</span> VkPhysicalDeviceProperties& devProps,</div> +<div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>  <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties& memProps,</div> +<div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>  uint32_t vulkanApiVersion,</div> +<div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>  <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled,</div> +<div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>  <span class="keywordtype">bool</span> bindMemory2ExtensionEnabled,</div> +<div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>  <span class="keywordtype">bool</span> memoryBudgetExtensionEnabled,</div> +<div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>  <span class="keywordtype">bool</span> deviceCoherentMemoryExtensionEnabled);</div> +<div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>  ~VmaRecorder();</div> +<div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>  </div> +<div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>  <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div> +<div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>  <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div> +<div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>  <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div> +<div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> +<div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> +<div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>  <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> +<div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>  <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div> +<div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> +<div class="line"><a name="l08005"></a><span class="lineno"> 8005</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="l08006"></a><span class="lineno"> 8006</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>  <span class="keywordtype">void</span> RecordAllocateMemoryPages(uint32_t frameIndex,</div> +<div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> +<div class="line"><a name="l08009"></a><span class="lineno"> 8009</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="l08010"></a><span class="lineno"> 8010</span>  uint64_t allocationCount,</div> +<div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>  <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div> +<div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> +<div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> +<div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> +<div class="line"><a name="l08016"></a><span class="lineno"> 8016</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="l08017"></a><span class="lineno"> 8017</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>  <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div> +<div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> +<div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> +<div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> +<div class="line"><a name="l08022"></a><span class="lineno"> 8022</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="l08023"></a><span class="lineno"> 8023</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>  <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div> +<div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>  <span class="keywordtype">void</span> RecordFreeMemoryPages(uint32_t frameIndex,</div> +<div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>  uint64_t allocationCount,</div> +<div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>  <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div> +<div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div> +<div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div> +<div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>  <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div> +<div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>  <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div> +<div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>  <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div> +<div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>  <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div> +<div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div> +<div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>  <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div> +<div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div> +<div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>  <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div> +<div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>  <span class="keyword">const</span> VkBufferCreateInfo& bufCreateInfo,</div> +<div class="line"><a name="l08044"></a><span class="lineno"> 8044</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="l08045"></a><span class="lineno"> 8045</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>  <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div> +<div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>  <span class="keyword">const</span> VkImageCreateInfo& imageCreateInfo,</div> +<div class="line"><a name="l08048"></a><span class="lineno"> 8048</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="l08049"></a><span class="lineno"> 8049</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>  <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div> +<div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>  <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div> +<div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>  <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div> +<div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>  <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div> +<div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>  <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div> +<div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> +<div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>  <span class="keywordtype">void</span> RecordDefragmentationBegin(uint32_t frameIndex,</div> +<div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div> +<div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div> +<div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>  <span class="keywordtype">void</span> RecordDefragmentationEnd(uint32_t frameIndex,</div> +<div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx);</div> +<div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>  <span class="keywordtype">void</span> RecordSetPoolName(uint32_t frameIndex,</div> +<div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div> +<div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* name);</div> +<div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>  </div> +<div class="line"><a name="l08069"></a><span class="lineno"> 8069</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>  <span class="keyword">struct </span>CallParams</div> +<div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>  {</div> +<div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>  uint32_t threadId;</div> +<div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>  <span class="keywordtype">double</span> time;</div> +<div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>  };</div> +<div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>  </div> +<div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>  <span class="keyword">class </span>UserDataString</div> +<div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>  {</div> +<div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>  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="l08080"></a><span class="lineno"> 8080</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div> +<div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>  </div> +<div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>  <span class="keywordtype">char</span> m_PtrStr[17];</div> +<div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div> +<div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>  };</div> +<div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>  </div> +<div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>  <span class="keywordtype">bool</span> m_UseMutex;</div> +<div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>  <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div> +<div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>  FILE* m_File;</div> +<div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>  VMA_MUTEX m_FileMutex;</div> +<div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>  std::chrono::time_point<std::chrono::high_resolution_clock> m_RecordingStartTime;</div> +<div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>  </div> +<div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>  <span class="keywordtype">void</span> GetBasicParams(CallParams& outParams);</div> +<div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>  </div> +<div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>  <span class="comment">// T must be a pointer type, e.g. VmaAllocation, VmaPool.</span></div> +<div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>  <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> T* pItems)</div> +<div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>  {</div> +<div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>  <span class="keywordflow">if</span>(count)</div> +<div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>  {</div> +<div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>  fprintf(m_File, <span class="stringliteral">"%p"</span>, pItems[0]);</div> +<div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>  <span class="keywordflow">for</span>(uint64_t i = 1; i < count; ++i)</div> +<div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>  {</div> +<div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>  fprintf(m_File, <span class="stringliteral">" %p"</span>, pItems[i]);</div> +<div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>  }</div> +<div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>  }</div> +<div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>  }</div> +<div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>  </div> +<div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>  <span class="keywordtype">void</span> PrintPointerList(uint64_t count, <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pItems);</div> +<div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>  <span class="keywordtype">void</span> Flush();</div> +<div class="line"><a name="l08111"></a><span class="lineno"> 8111</span> };</div> +<div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>  </div> +<div class="line"><a name="l08113"></a><span class="lineno"> 8113</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>  </div> +<div class="line"><a name="l08115"></a><span class="lineno"> 8115</span> <span class="comment">/*</span></div> +<div class="line"><a name="l08116"></a><span class="lineno"> 8116</span> <span class="comment">Thread-safe wrapper over VmaPoolAllocator free list, for allocation of VmaAllocation_T objects.</span></div> +<div class="line"><a name="l08117"></a><span class="lineno"> 8117</span> <span class="comment">*/</span></div> +<div class="line"><a name="l08118"></a><span class="lineno"> 8118</span> <span class="keyword">class </span>VmaAllocationObjectAllocator</div> +<div class="line"><a name="l08119"></a><span class="lineno"> 8119</span> {</div> +<div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>  VMA_CLASS_NO_COPY(VmaAllocationObjectAllocator)</div> +<div class="line"><a name="l08121"></a><span class="lineno"> 8121</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>  VmaAllocationObjectAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div> +<div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>  </div> +<div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>  <span class="keyword">template</span><<span class="keyword">typename</span>... Types> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> Allocate(Types... args);</div> +<div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>  <span class="keywordtype">void</span> Free(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc);</div> +<div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>  </div> +<div class="line"><a name="l08127"></a><span class="lineno"> 8127</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>  VMA_MUTEX m_Mutex;</div> +<div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>  VmaPoolAllocator<VmaAllocation_T> m_Allocator;</div> +<div class="line"><a name="l08130"></a><span class="lineno"> 8130</span> };</div> +<div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>  </div> +<div class="line"><a name="l08132"></a><span class="lineno"> 8132</span> <span class="keyword">struct </span>VmaCurrentBudgetData</div> +<div class="line"><a name="l08133"></a><span class="lineno"> 8133</span> {</div> +<div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>  VMA_ATOMIC_UINT64 m_BlockBytes[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>  VMA_ATOMIC_UINT64 m_AllocationBytes[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>  </div> +<div class="line"><a name="l08137"></a><span class="lineno"> 8137</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>  VMA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;</div> +<div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>  VMA_RW_MUTEX m_BudgetMutex;</div> +<div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>  uint64_t m_VulkanUsage[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>  uint64_t m_VulkanBudget[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>  uint64_t m_BlockBytesAtBudgetFetch[VK_MAX_MEMORY_HEAPS];</div> +<div class="line"><a name="l08143"></a><span class="lineno"> 8143</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div> <div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>  </div> -<div class="line"><a name="l08145"></a><span class="lineno"> 8145</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l08146"></a><span class="lineno"> 8146</span> <span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div> -<div class="line"><a name="l08147"></a><span class="lineno"> 8147</span> {</div> -<div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div> -<div class="line"><a name="l08149"></a><span class="lineno"> 8149</span> }</div> -<div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>  </div> -<div class="line"><a name="l08151"></a><span class="lineno"> 8151</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l08152"></a><span class="lineno"> 8152</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div> -<div class="line"><a name="l08153"></a><span class="lineno"> 8153</span> {</div> -<div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> -<div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>  {</div> -<div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>  ptr->~T();</div> -<div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>  VmaFree(hAllocator, ptr);</div> -<div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>  }</div> -<div class="line"><a name="l08159"></a><span class="lineno"> 8159</span> }</div> -<div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>  </div> -<div class="line"><a name="l08161"></a><span class="lineno"> 8161</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l08162"></a><span class="lineno"> 8162</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div> -<div class="line"><a name="l08163"></a><span class="lineno"> 8163</span> {</div> -<div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> -<div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>  {</div> -<div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div> -<div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>  ptr[i].~T();</div> -<div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>  VmaFree(hAllocator, ptr);</div> +<div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>  VmaCurrentBudgetData()</div> +<div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>  {</div> +<div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>  <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex < VK_MAX_MEMORY_HEAPS; ++heapIndex)</div> +<div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>  {</div> +<div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>  m_BlockBytes[heapIndex] = 0;</div> +<div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>  m_AllocationBytes[heapIndex] = 0;</div> +<div class="line"><a name="l08151"></a><span class="lineno"> 8151</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>  m_VulkanUsage[heapIndex] = 0;</div> +<div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>  m_VulkanBudget[heapIndex] = 0;</div> +<div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>  m_BlockBytesAtBudgetFetch[heapIndex] = 0;</div> +<div class="line"><a name="l08155"></a><span class="lineno"> 8155</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>  }</div> +<div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>  </div> +<div class="line"><a name="l08158"></a><span class="lineno"> 8158</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>  m_OperationsSinceBudgetFetch = 0;</div> +<div class="line"><a name="l08160"></a><span class="lineno"> 8160</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>  }</div> +<div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>  </div> +<div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>  <span class="keywordtype">void</span> AddAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div> +<div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>  {</div> +<div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>  m_AllocationBytes[heapIndex] += allocationSize;</div> +<div class="line"><a name="l08166"></a><span class="lineno"> 8166</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>  ++m_OperationsSinceBudgetFetch;</div> +<div class="line"><a name="l08168"></a><span class="lineno"> 8168</span> <span class="preprocessor">#endif</span></div> <div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>  }</div> -<div class="line"><a name="l08170"></a><span class="lineno"> 8170</span> }</div> -<div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>  </div> -<div class="line"><a name="l08173"></a><span class="lineno"> 8173</span> <span class="comment">// VmaStringBuilder</span></div> -<div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>  </div> -<div class="line"><a name="l08175"></a><span class="lineno"> 8175</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>  </div> -<div class="line"><a name="l08177"></a><span class="lineno"> 8177</span> <span class="keyword">class </span>VmaStringBuilder</div> -<div class="line"><a name="l08178"></a><span class="lineno"> 8178</span> {</div> -<div class="line"><a name="l08179"></a><span class="lineno"> 8179</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>  VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator<char>(alloc->GetAllocationCallbacks())) { }</div> -<div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>  <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div> -<div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div> -<div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>  </div> -<div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>  <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div> -<div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>  <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> -<div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>  <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">'\n'</span>); }</div> -<div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>  <span class="keywordtype">void</span> AddNumber(uint32_t num);</div> -<div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>  <span class="keywordtype">void</span> AddNumber(uint64_t num);</div> -<div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>  <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div> -<div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>  </div> -<div class="line"><a name="l08191"></a><span class="lineno"> 8191</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>  VmaVector< char, VmaStlAllocator<char> > m_Data;</div> -<div class="line"><a name="l08193"></a><span class="lineno"> 8193</span> };</div> -<div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>  </div> -<div class="line"><a name="l08195"></a><span class="lineno"> 8195</span> <span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l08196"></a><span class="lineno"> 8196</span> {</div> -<div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div> -<div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>  <span class="keywordflow">if</span>(strLen > 0)</div> -<div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>  {</div> -<div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div> -<div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>  m_Data.resize(oldCount + strLen);</div> -<div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>  memcpy(m_Data.data() + oldCount, pStr, strLen);</div> -<div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>  }</div> -<div class="line"><a name="l08204"></a><span class="lineno"> 8204</span> }</div> -<div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>  </div> -<div class="line"><a name="l08206"></a><span class="lineno"> 8206</span> <span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div> -<div class="line"><a name="l08207"></a><span class="lineno"> 8207</span> {</div> -<div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>  <span class="keywordtype">char</span> buf[11];</div> -<div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>  buf[10] = <span class="charliteral">'\0'</span>;</div> -<div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>  <span class="keywordtype">char</span> *p = &buf[10];</div> -<div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>  <span class="keywordflow">do</span></div> -<div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>  {</div> -<div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>  *--p = <span class="charliteral">'0'</span> + (num % 10);</div> -<div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>  num /= 10;</div> -<div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>  }</div> -<div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>  <span class="keywordflow">while</span>(num);</div> -<div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>  Add(p);</div> -<div class="line"><a name="l08218"></a><span class="lineno"> 8218</span> }</div> -<div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>  </div> -<div class="line"><a name="l08220"></a><span class="lineno"> 8220</span> <span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div> -<div class="line"><a name="l08221"></a><span class="lineno"> 8221</span> {</div> -<div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>  <span class="keywordtype">char</span> buf[21];</div> -<div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>  buf[20] = <span class="charliteral">'\0'</span>;</div> -<div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>  <span class="keywordtype">char</span> *p = &buf[20];</div> -<div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>  <span class="keywordflow">do</span></div> -<div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>  {</div> -<div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>  *--p = <span class="charliteral">'0'</span> + (num % 10);</div> -<div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>  num /= 10;</div> -<div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>  }</div> -<div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>  <span class="keywordflow">while</span>(num);</div> -<div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>  Add(p);</div> -<div class="line"><a name="l08232"></a><span class="lineno"> 8232</span> }</div> -<div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>  </div> -<div class="line"><a name="l08234"></a><span class="lineno"> 8234</span> <span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l08235"></a><span class="lineno"> 8235</span> {</div> -<div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>  <span class="keywordtype">char</span> buf[21];</div> -<div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>  VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div> -<div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>  Add(buf);</div> -<div class="line"><a name="l08239"></a><span class="lineno"> 8239</span> }</div> -<div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>  </div> -<div class="line"><a name="l08241"></a><span class="lineno"> 8241</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>  </div> -<div class="line"><a name="l08244"></a><span class="lineno"> 8244</span> <span class="comment">// VmaJsonWriter</span></div> -<div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>  </div> -<div class="line"><a name="l08246"></a><span class="lineno"> 8246</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>  </div> -<div class="line"><a name="l08248"></a><span class="lineno"> 8248</span> <span class="keyword">class </span>VmaJsonWriter</div> -<div class="line"><a name="l08249"></a><span class="lineno"> 8249</span> {</div> -<div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>  VMA_CLASS_NO_COPY(VmaJsonWriter)</div> -<div class="line"><a name="l08251"></a><span class="lineno"> 8251</span> <span class="keyword">public</span>:</div> -<div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>  VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb);</div> -<div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>  ~VmaJsonWriter();</div> -<div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>  </div> -<div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>  <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div> -<div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>  <span class="keywordtype">void</span> EndObject();</div> -<div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>  </div> -<div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>  <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div> -<div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>  <span class="keywordtype">void</span> EndArray();</div> -<div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>  </div> -<div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>  <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> -<div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>  <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div> -<div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>  <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> -<div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>  <span class="keywordtype">void</span> ContinueString(uint32_t n);</div> -<div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>  <span class="keywordtype">void</span> ContinueString(uint64_t n);</div> -<div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>  <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div> -<div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>  <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div> -<div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>  </div> -<div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>  <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div> -<div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>  <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div> -<div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>  <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div> -<div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>  <span class="keywordtype">void</span> WriteNull();</div> -<div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>  </div> -<div class="line"><a name="l08274"></a><span class="lineno"> 8274</span> <span class="keyword">private</span>:</div> -<div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div> -<div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>  </div> -<div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>  <span class="keyword">enum</span> COLLECTION_TYPE</div> -<div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>  {</div> -<div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>  COLLECTION_TYPE_OBJECT,</div> -<div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>  COLLECTION_TYPE_ARRAY,</div> -<div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>  };</div> -<div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>  <span class="keyword">struct </span>StackItem</div> -<div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>  {</div> -<div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>  COLLECTION_TYPE type;</div> -<div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>  uint32_t valueCount;</div> -<div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>  <span class="keywordtype">bool</span> singleLineMode;</div> -<div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>  };</div> -<div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>  </div> -<div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>  VmaStringBuilder& m_SB;</div> -<div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>  VmaVector< StackItem, VmaStlAllocator<StackItem> > m_Stack;</div> -<div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>  <span class="keywordtype">bool</span> m_InsideString;</div> -<div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>  </div> -<div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>  <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div> -<div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>  <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div> -<div class="line"><a name="l08295"></a><span class="lineno"> 8295</span> };</div> -<div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>  </div> -<div class="line"><a name="l08297"></a><span class="lineno"> 8297</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">" "</span>;</div> -<div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>  </div> -<div class="line"><a name="l08299"></a><span class="lineno"> 8299</span> VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb) :</div> -<div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>  m_SB(sb),</div> -<div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>  m_Stack(VmaStlAllocator<StackItem>(pAllocationCallbacks)),</div> -<div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>  m_InsideString(false)</div> -<div class="line"><a name="l08303"></a><span class="lineno"> 8303</span> {</div> -<div class="line"><a name="l08304"></a><span class="lineno"> 8304</span> }</div> +<div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>  </div> +<div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>  <span class="keywordtype">void</span> RemoveAllocation(uint32_t heapIndex, VkDeviceSize allocationSize)</div> +<div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>  {</div> +<div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>  VMA_ASSERT(m_AllocationBytes[heapIndex] >= allocationSize); <span class="comment">// DELME</span></div> +<div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>  m_AllocationBytes[heapIndex] -= allocationSize;</div> +<div class="line"><a name="l08175"></a><span class="lineno"> 8175</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>  ++m_OperationsSinceBudgetFetch;</div> +<div class="line"><a name="l08177"></a><span class="lineno"> 8177</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>  }</div> +<div class="line"><a name="l08179"></a><span class="lineno"> 8179</span> };</div> +<div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>  </div> +<div class="line"><a name="l08181"></a><span class="lineno"> 8181</span> <span class="comment">// Main allocator object.</span></div> +<div class="line"><a name="l08182"></a><span class="lineno"> 8182</span> <span class="keyword">struct </span>VmaAllocator_T</div> +<div class="line"><a name="l08183"></a><span class="lineno"> 8183</span> {</div> +<div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>  VMA_CLASS_NO_COPY(VmaAllocator_T)</div> +<div class="line"><a name="l08185"></a><span class="lineno"> 8185</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>  <span class="keywordtype">bool</span> m_UseMutex;</div> +<div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>  uint32_t m_VulkanApiVersion;</div> +<div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>  <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation; <span class="comment">// Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).</span></div> +<div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>  <span class="keywordtype">bool</span> m_UseKhrBindMemory2; <span class="comment">// Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).</span></div> +<div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>  <span class="keywordtype">bool</span> m_UseExtMemoryBudget;</div> +<div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>  <span class="keywordtype">bool</span> m_UseAmdDeviceCoherentMemory;</div> +<div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>  <span class="keywordtype">bool</span> m_UseKhrBufferDeviceAddress;</div> +<div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>  <span class="keywordtype">bool</span> m_UseExtMemoryPriority;</div> +<div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>  VkDevice m_hDevice;</div> +<div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>  VkInstance m_hInstance;</div> +<div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>  <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div> +<div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>  VkAllocationCallbacks m_AllocationCallbacks;</div> +<div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>  <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div> +<div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>  VmaAllocationObjectAllocator m_AllocationObjectAllocator;</div> +<div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>  </div> +<div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>  <span class="comment">// Each bit (1 << i) is set if HeapSizeLimit is enabled for that heap, so cannot allocate more than the heap size.</span></div> +<div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>  uint32_t m_HeapSizeLimitMask;</div> +<div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>  </div> +<div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>  VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div> +<div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>  VkPhysicalDeviceMemoryProperties m_MemProps;</div> +<div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>  </div> +<div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>  <span class="comment">// Default pools.</span></div> +<div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>  VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div> +<div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>  </div> +<div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>  <span class="keyword">typedef</span> VmaIntrusiveLinkedList<VmaDedicatedAllocationListItemTraits> DedicatedAllocationLinkedList;</div> +<div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>  DedicatedAllocationLinkedList m_DedicatedAllocations[VK_MAX_MEMORY_TYPES];</div> +<div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>  VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div> +<div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>  </div> +<div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>  VmaCurrentBudgetData m_Budget;</div> +<div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>  VMA_ATOMIC_UINT32 m_DeviceMemoryCount; <span class="comment">// Total number of VkDeviceMemory objects.</span></div> +<div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>  </div> +<div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>  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="l08218"></a><span class="lineno"> 8218</span>  VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div> +<div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>  ~VmaAllocator_T();</div> +<div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>  </div> +<div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>  <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div> +<div class="line"><a name="l08222"></a><span class="lineno"> 8222</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>  <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : 0;</div> +<div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>  }</div> +<div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>& GetVulkanFunctions()<span class="keyword"> const</span></div> +<div class="line"><a name="l08226"></a><span class="lineno"> 8226</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>  <span class="keywordflow">return</span> m_VulkanFunctions;</div> +<div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>  }</div> +<div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>  </div> +<div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>  VkPhysicalDevice GetPhysicalDevice()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PhysicalDevice; }</div> +<div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>  </div> +<div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>  VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div> +<div class="line"><a name="l08233"></a><span class="lineno"> 8233</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>  <span class="keywordflow">return</span> VMA_MAX(</div> +<div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>  <span class="keyword">static_cast<</span>VkDeviceSize<span class="keyword">></span>(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div> +<div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>  m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div> +<div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>  }</div> +<div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>  </div> +<div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>  uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div> +<div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>  uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div> +<div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>  </div> +<div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>  uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div> +<div class="line"><a name="l08243"></a><span class="lineno"> 8243</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>  VMA_ASSERT(memTypeIndex < m_MemProps.memoryTypeCount);</div> +<div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>  <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div> +<div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>  }</div> +<div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>  <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div> +<div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>  <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div> +<div class="line"><a name="l08249"></a><span class="lineno"> 8249</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>  <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags & (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div> +<div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>  VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div> +<div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>  }</div> +<div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>  <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div> +<div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>  VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div> +<div class="line"><a name="l08255"></a><span class="lineno"> 8255</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>  <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div> +<div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>  VMA_MAX((VkDeviceSize)VMA_MIN_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div> +<div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>  (VkDeviceSize)VMA_MIN_ALIGNMENT;</div> +<div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>  }</div> +<div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>  </div> +<div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>  <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div> +<div class="line"><a name="l08262"></a><span class="lineno"> 8262</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>  <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div> +<div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>  }</div> +<div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>  </div> +<div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>  uint32_t GetGlobalMemoryTypeBits()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_GlobalMemoryTypeBits; }</div> +<div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>  </div> +<div class="line"><a name="l08268"></a><span class="lineno"> 8268</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>  VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div> +<div class="line"><a name="l08270"></a><span class="lineno"> 8270</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>  </div> +<div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>  <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div> +<div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>  VkBuffer hBuffer,</div> +<div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>  VkMemoryRequirements& memReq,</div> +<div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div> +<div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation) <span class="keyword">const</span>;</div> +<div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>  <span class="keywordtype">void</span> GetImageMemoryRequirements(</div> +<div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>  VkImage hImage,</div> +<div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>  VkMemoryRequirements& memReq,</div> +<div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>  <span class="keywordtype">bool</span>& requiresDedicatedAllocation,</div> +<div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>  <span class="keywordtype">bool</span>& prefersDedicatedAllocation) <span class="keyword">const</span>;</div> +<div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>  </div> +<div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>  <span class="comment">// Main allocation function.</span></div> +<div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>  VkResult AllocateMemory(</div> +<div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>  <span class="keyword">const</span> VkMemoryRequirements& vkMemReq,</div> +<div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>  <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div> +<div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>  <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div> +<div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>  VkBuffer dedicatedBuffer,</div> +<div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>  VkBufferUsageFlags dedicatedBufferUsage, <span class="comment">// UINT32_MAX when unknown.</span></div> +<div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>  VkImage dedicatedImage,</div> +<div class="line"><a name="l08291"></a><span class="lineno"> 8291</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="l08292"></a><span class="lineno"> 8292</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>  </div> +<div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>  <span class="comment">// Main deallocation function.</span></div> +<div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>  <span class="keywordtype">void</span> FreeMemory(</div> +<div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>  </div> +<div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>  <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div> +<div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>  </div> +<div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>  <span class="keywordtype">void</span> GetBudget(</div> +<div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a>* outBudget, uint32_t firstHeap, uint32_t heapCount);</div> <div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>  </div> -<div class="line"><a name="l08306"></a><span class="lineno"> 8306</span> VmaJsonWriter::~VmaJsonWriter()</div> -<div class="line"><a name="l08307"></a><span class="lineno"> 8307</span> {</div> -<div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>  VMA_ASSERT(m_Stack.empty());</div> -<div class="line"><a name="l08310"></a><span class="lineno"> 8310</span> }</div> -<div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>  </div> -<div class="line"><a name="l08312"></a><span class="lineno"> 8312</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div> -<div class="line"><a name="l08313"></a><span class="lineno"> 8313</span> {</div> -<div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>  </div> -<div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>  m_SB.Add(<span class="charliteral">'{'</span>);</div> -<div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>  </div> -<div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>  StackItem item;</div> -<div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>  item.type = COLLECTION_TYPE_OBJECT;</div> -<div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>  item.valueCount = 0;</div> -<div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>  item.singleLineMode = singleLine;</div> -<div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>  m_Stack.push_back(item);</div> -<div class="line"><a name="l08324"></a><span class="lineno"> 8324</span> }</div> +<div class="line"><a name="l08306"></a><span class="lineno"> 8306</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>  <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json);</div> +<div class="line"><a name="l08308"></a><span class="lineno"> 8308</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>  </div> +<div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>  VkResult DefragmentationBegin(</div> +<div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>& info,</div> +<div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>  <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div> +<div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div> +<div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>  VkResult DefragmentationEnd(</div> +<div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> +<div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>  </div> +<div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>  VkResult DefragmentationPassBegin(</div> +<div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>  <a class="code" href="struct_vma_defragmentation_pass_info.html">VmaDefragmentationPassInfo</a>* pInfo,</div> +<div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> +<div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>  VkResult DefragmentationPassEnd(</div> +<div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>  <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div> +<div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>  </div> +<div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>  <span class="keywordtype">void</span> GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div> +<div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>  <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> <div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>  </div> -<div class="line"><a name="l08326"></a><span class="lineno"> 8326</span> <span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div> -<div class="line"><a name="l08327"></a><span class="lineno"> 8327</span> {</div> -<div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>  VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div> +<div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>  <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div> +<div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>  <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div> <div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>  </div> -<div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>  WriteIndent(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>  m_SB.Add(<span class="charliteral">'}'</span>);</div> +<div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>  <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div> +<div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>  uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div> <div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>  </div> -<div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>  VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div> -<div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>  m_Stack.pop_back();</div> -<div class="line"><a name="l08335"></a><span class="lineno"> 8335</span> }</div> -<div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>  </div> -<div class="line"><a name="l08337"></a><span class="lineno"> 8337</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div> -<div class="line"><a name="l08338"></a><span class="lineno"> 8338</span> {</div> -<div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>  <span class="keywordtype">void</span> MakePoolAllocationsLost(</div> +<div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div> +<div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>  <span class="keywordtype">size_t</span>* pLostAllocationCount);</div> +<div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>  VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div> +<div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>  VkResult CheckCorruption(uint32_t memoryTypeBits);</div> +<div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>  </div> +<div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>  <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> <div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>  </div> -<div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>  m_SB.Add(<span class="charliteral">'['</span>);</div> -<div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>  </div> -<div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>  StackItem item;</div> -<div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>  item.type = COLLECTION_TYPE_ARRAY;</div> -<div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>  item.valueCount = 0;</div> -<div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>  item.singleLineMode = singleLine;</div> -<div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>  m_Stack.push_back(item);</div> -<div class="line"><a name="l08349"></a><span class="lineno"> 8349</span> }</div> -<div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>  </div> -<div class="line"><a name="l08351"></a><span class="lineno"> 8351</span> <span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div> -<div class="line"><a name="l08352"></a><span class="lineno"> 8352</span> {</div> -<div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>  </div> -<div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>  WriteIndent(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>  m_SB.Add(<span class="charliteral">']'</span>);</div> +<div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>  <span class="comment">// Call to Vulkan function vkAllocateMemory with accompanying bookkeeping.</span></div> +<div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>  VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div> +<div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>  <span class="comment">// Call to Vulkan function vkFreeMemory with accompanying bookkeeping.</span></div> +<div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>  <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div> +<div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>  <span class="comment">// Call to Vulkan function vkBindBufferMemory or vkBindBufferMemory2KHR.</span></div> +<div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>  VkResult BindVulkanBuffer(</div> +<div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>  VkDeviceMemory memory,</div> +<div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>  VkDeviceSize memoryOffset,</div> +<div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>  VkBuffer buffer,</div> +<div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> +<div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>  <span class="comment">// Call to Vulkan function vkBindImageMemory or vkBindImageMemory2KHR.</span></div> +<div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>  VkResult BindVulkanImage(</div> +<div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>  VkDeviceMemory memory,</div> +<div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>  VkDeviceSize memoryOffset,</div> +<div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>  VkImage image,</div> +<div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> <div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>  </div> -<div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>  VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div> -<div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>  m_Stack.pop_back();</div> -<div class="line"><a name="l08360"></a><span class="lineno"> 8360</span> }</div> -<div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>  </div> -<div class="line"><a name="l08362"></a><span class="lineno"> 8362</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l08363"></a><span class="lineno"> 8363</span> {</div> -<div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>  BeginString(pStr);</div> -<div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>  EndString();</div> -<div class="line"><a name="l08366"></a><span class="lineno"> 8366</span> }</div> -<div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>  </div> -<div class="line"><a name="l08368"></a><span class="lineno"> 8368</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l08369"></a><span class="lineno"> 8369</span> {</div> -<div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>  VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div> +<div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>  <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div> +<div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>  </div> +<div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>  VkResult BindBufferMemory(</div> +<div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>  VkBuffer hBuffer,</div> +<div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> +<div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>  VkResult BindImageMemory(</div> +<div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>  VkImage hImage,</div> +<div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext);</div> <div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>  </div> -<div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>  BeginValue(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>  m_SB.Add(<span class="charliteral">'"'</span>);</div> -<div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>  m_InsideString = <span class="keyword">true</span>;</div> -<div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>  <span class="keywordflow">if</span>(pStr != VMA_NULL && pStr[0] != <span class="charliteral">'\0'</span>)</div> -<div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>  {</div> -<div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>  ContinueString(pStr);</div> -<div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>  }</div> -<div class="line"><a name="l08379"></a><span class="lineno"> 8379</span> }</div> -<div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>  </div> -<div class="line"><a name="l08381"></a><span class="lineno"> 8381</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l08382"></a><span class="lineno"> 8382</span> {</div> -<div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>  VMA_ASSERT(m_InsideString);</div> -<div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>  </div> -<div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div> -<div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < strLen; ++i)</div> -<div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>  {</div> -<div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>  <span class="keywordtype">char</span> ch = pStr[i];</div> -<div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>  <span class="keywordflow">if</span>(ch == <span class="charliteral">'\\'</span>)</div> -<div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>  {</div> -<div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>  m_SB.Add(<span class="stringliteral">"\\\\"</span>);</div> -<div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>  }</div> -<div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">'"'</span>)</div> -<div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>  {</div> -<div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>  m_SB.Add(<span class="stringliteral">"\\\""</span>);</div> -<div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>  }</div> -<div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch >= 32)</div> -<div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>  {</div> -<div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>  m_SB.Add(ch);</div> -<div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>  }</div> -<div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>  <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div> -<div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>  {</div> -<div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>  <span class="keywordflow">case</span> <span class="charliteral">'\b'</span>:</div> -<div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>  m_SB.Add(<span class="stringliteral">"\\b"</span>);</div> -<div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>  <span class="keywordflow">case</span> <span class="charliteral">'\f'</span>:</div> -<div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>  m_SB.Add(<span class="stringliteral">"\\f"</span>);</div> -<div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>  <span class="keywordflow">case</span> <span class="charliteral">'\n'</span>:</div> -<div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>  m_SB.Add(<span class="stringliteral">"\\n"</span>);</div> -<div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>  <span class="keywordflow">case</span> <span class="charliteral">'\r'</span>:</div> -<div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>  m_SB.Add(<span class="stringliteral">"\\r"</span>);</div> -<div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>  <span class="keywordflow">case</span> <span class="charliteral">'\t'</span>:</div> -<div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>  m_SB.Add(<span class="stringliteral">"\\t"</span>);</div> -<div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>  VMA_ASSERT(0 && <span class="stringliteral">"Character not currently supported."</span>);</div> -<div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>  }</div> -<div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>  }</div> -<div class="line"><a name="l08423"></a><span class="lineno"> 8423</span> }</div> +<div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>  VkResult FlushOrInvalidateAllocation(</div> +<div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>  VkDeviceSize offset, VkDeviceSize size,</div> +<div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>  VMA_CACHE_OPERATION op);</div> +<div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>  VkResult FlushOrInvalidateAllocations(</div> +<div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>  uint32_t allocationCount,</div> +<div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* allocations,</div> +<div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>  <span class="keyword">const</span> VkDeviceSize* offsets, <span class="keyword">const</span> VkDeviceSize* sizes,</div> +<div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>  VMA_CACHE_OPERATION op);</div> +<div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>  </div> +<div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>  <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</div> +<div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>  </div> +<div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l08385"></a><span class="lineno"> 8385</span> <span class="comment"> Returns bit mask of memory types that can support defragmentation on GPU as</span></div> +<div class="line"><a name="l08386"></a><span class="lineno"> 8386</span> <span class="comment"> they support creation of required buffer for copy operations.</span></div> +<div class="line"><a name="l08387"></a><span class="lineno"> 8387</span> <span class="comment"> */</span></div> +<div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>  uint32_t GetGpuDefragmentationMemoryTypeBits();</div> +<div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>  </div> +<div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>  </div> +<div class="line"><a name="l08391"></a><span class="lineno"> 8391</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>  VkDeviceSize m_PreferredLargeHeapBlockSize;</div> +<div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>  </div> +<div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>  VkPhysicalDevice m_PhysicalDevice;</div> +<div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>  VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div> +<div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>  VMA_ATOMIC_UINT32 m_GpuDefragmentationMemoryTypeBits; <span class="comment">// UINT32_MAX means uninitialized.</span></div> +<div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>  </div> +<div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>  VMA_RW_MUTEX m_PoolsMutex;</div> +<div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>  <span class="keyword">typedef</span> VmaIntrusiveLinkedList<VmaPoolListItemTraits> PoolList;</div> +<div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>  <span class="comment">// Protected by m_PoolsMutex.</span></div> +<div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>  PoolList m_Pools;</div> +<div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>  uint32_t m_NextPoolId;</div> +<div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>  </div> +<div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>  <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div> +<div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>  </div> +<div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>  <span class="comment">// Global bit mask AND-ed with any memoryTypeBits to disallow certain memory types.</span></div> +<div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>  uint32_t m_GlobalMemoryTypeBits;</div> +<div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>  </div> +<div class="line"><a name="l08409"></a><span class="lineno"> 8409</span> <span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div> +<div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>  VmaRecorder* m_pRecorder;</div> +<div class="line"><a name="l08411"></a><span class="lineno"> 8411</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>  </div> +<div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>  <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div> +<div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>  </div> +<div class="line"><a name="l08415"></a><span class="lineno"> 8415</span> <span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div> +<div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Static();</div> +<div class="line"><a name="l08417"></a><span class="lineno"> 8417</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>  </div> +<div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Custom(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div> +<div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>  </div> +<div class="line"><a name="l08421"></a><span class="lineno"> 8421</span> <span class="preprocessor">#if VMA_DYNAMIC_VULKAN_FUNCTIONS == 1</span></div> +<div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>  <span class="keywordtype">void</span> ImportVulkanFunctions_Dynamic();</div> +<div class="line"><a name="l08423"></a><span class="lineno"> 8423</span> <span class="preprocessor">#endif</span></div> <div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>  </div> -<div class="line"><a name="l08425"></a><span class="lineno"> 8425</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div> -<div class="line"><a name="l08426"></a><span class="lineno"> 8426</span> {</div> -<div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>  VMA_ASSERT(m_InsideString);</div> -<div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>  m_SB.AddNumber(n);</div> -<div class="line"><a name="l08429"></a><span class="lineno"> 8429</span> }</div> -<div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>  </div> -<div class="line"><a name="l08431"></a><span class="lineno"> 8431</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div> -<div class="line"><a name="l08432"></a><span class="lineno"> 8432</span> {</div> -<div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>  VMA_ASSERT(m_InsideString);</div> -<div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>  m_SB.AddNumber(n);</div> -<div class="line"><a name="l08435"></a><span class="lineno"> 8435</span> }</div> -<div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>  </div> -<div class="line"><a name="l08437"></a><span class="lineno"> 8437</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> -<div class="line"><a name="l08438"></a><span class="lineno"> 8438</span> {</div> -<div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>  VMA_ASSERT(m_InsideString);</div> -<div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>  m_SB.AddPointer(ptr);</div> -<div class="line"><a name="l08441"></a><span class="lineno"> 8441</span> }</div> -<div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>  </div> -<div class="line"><a name="l08443"></a><span class="lineno"> 8443</span> <span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> -<div class="line"><a name="l08444"></a><span class="lineno"> 8444</span> {</div> -<div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>  VMA_ASSERT(m_InsideString);</div> -<div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>  <span class="keywordflow">if</span>(pStr != VMA_NULL && pStr[0] != <span class="charliteral">'\0'</span>)</div> -<div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>  {</div> -<div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>  ContinueString(pStr);</div> -<div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>  }</div> -<div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>  m_SB.Add(<span class="charliteral">'"'</span>);</div> -<div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>  m_InsideString = <span class="keyword">false</span>;</div> -<div class="line"><a name="l08452"></a><span class="lineno"> 8452</span> }</div> -<div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>  </div> -<div class="line"><a name="l08454"></a><span class="lineno"> 8454</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div> -<div class="line"><a name="l08455"></a><span class="lineno"> 8455</span> {</div> -<div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>  m_SB.AddNumber(n);</div> -<div class="line"><a name="l08459"></a><span class="lineno"> 8459</span> }</div> -<div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>  </div> -<div class="line"><a name="l08461"></a><span class="lineno"> 8461</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div> -<div class="line"><a name="l08462"></a><span class="lineno"> 8462</span> {</div> -<div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>  m_SB.AddNumber(n);</div> -<div class="line"><a name="l08466"></a><span class="lineno"> 8466</span> }</div> -<div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>  </div> -<div class="line"><a name="l08468"></a><span class="lineno"> 8468</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div> -<div class="line"><a name="l08469"></a><span class="lineno"> 8469</span> {</div> -<div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>  m_SB.Add(b ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);</div> -<div class="line"><a name="l08473"></a><span class="lineno"> 8473</span> }</div> -<div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>  </div> -<div class="line"><a name="l08475"></a><span class="lineno"> 8475</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div> -<div class="line"><a name="l08476"></a><span class="lineno"> 8476</span> {</div> -<div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>  VMA_ASSERT(!m_InsideString);</div> -<div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>  BeginValue(<span class="keyword">false</span>);</div> -<div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>  m_SB.Add(<span class="stringliteral">"null"</span>);</div> -<div class="line"><a name="l08480"></a><span class="lineno"> 8480</span> }</div> -<div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>  </div> -<div class="line"><a name="l08482"></a><span class="lineno"> 8482</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div> -<div class="line"><a name="l08483"></a><span class="lineno"> 8483</span> {</div> -<div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>  <span class="keywordflow">if</span>(!m_Stack.empty())</div> -<div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>  {</div> -<div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>  StackItem& currItem = m_Stack.back();</div> -<div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>  <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &&</div> -<div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>  currItem.valueCount % 2 == 0)</div> -<div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>  {</div> -<div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>  VMA_ASSERT(isString);</div> -<div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>  }</div> -<div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>  </div> -<div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>  <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &&</div> -<div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>  currItem.valueCount % 2 != 0)</div> -<div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>  {</div> -<div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>  m_SB.Add(<span class="stringliteral">": "</span>);</div> -<div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>  }</div> -<div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount > 0)</div> -<div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>  {</div> -<div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>  m_SB.Add(<span class="stringliteral">", "</span>);</div> -<div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>  WriteIndent();</div> -<div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>  }</div> -<div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>  {</div> -<div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>  WriteIndent();</div> -<div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>  }</div> -<div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>  ++currItem.valueCount;</div> -<div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>  }</div> -<div class="line"><a name="l08509"></a><span class="lineno"> 8509</span> }</div> -<div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>  </div> -<div class="line"><a name="l08511"></a><span class="lineno"> 8511</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div> -<div class="line"><a name="l08512"></a><span class="lineno"> 8512</span> {</div> -<div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>  <span class="keywordflow">if</span>(!m_Stack.empty() && !m_Stack.back().singleLineMode)</div> -<div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>  {</div> -<div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>  m_SB.AddNewLine();</div> -<div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>  </div> -<div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>  <span class="keywordtype">size_t</span> count = m_Stack.size();</div> -<div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>  <span class="keywordflow">if</span>(count > 0 && oneLess)</div> -<div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>  {</div> -<div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>  --count;</div> -<div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>  }</div> -<div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < count; ++i)</div> -<div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>  {</div> -<div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>  m_SB.Add(INDENT);</div> -<div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>  }</div> -<div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>  }</div> -<div class="line"><a name="l08527"></a><span class="lineno"> 8527</span> }</div> -<div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>  </div> -<div class="line"><a name="l08529"></a><span class="lineno"> 8529</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>  </div> -<div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>  </div> -<div class="line"><a name="l08533"></a><span class="lineno"> 8533</span> <span class="keywordtype">void</span> VmaAllocation_T::SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData)</div> -<div class="line"><a name="l08534"></a><span class="lineno"> 8534</span> {</div> -<div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>  <span class="keywordflow">if</span>(IsUserDataString())</div> -<div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>  {</div> -<div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>  VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div> -<div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>  </div> -<div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>  FreeUserDataString(hAllocator);</div> -<div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>  </div> -<div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>  <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div> -<div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>  {</div> -<div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>  m_pUserData = VmaCreateStringCopy(hAllocator->GetAllocationCallbacks(), (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div> -<div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>  }</div> -<div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>  }</div> -<div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>  {</div> -<div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>  m_pUserData = pUserData;</div> -<div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>  }</div> -<div class="line"><a name="l08550"></a><span class="lineno"> 8550</span> }</div> -<div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>  </div> -<div class="line"><a name="l08552"></a><span class="lineno"> 8552</span> <span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div> -<div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>  VmaDeviceMemoryBlock* block,</div> -<div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>  VkDeviceSize offset)</div> -<div class="line"><a name="l08556"></a><span class="lineno"> 8556</span> {</div> -<div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>  VMA_ASSERT(block != VMA_NULL);</div> -<div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> -<div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>  </div> -<div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>  <span class="comment">// Move mapping reference counter from old block to new block.</span></div> -<div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>  <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div> +<div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>  <span class="keywordtype">void</span> ValidateVulkanFunctions();</div> +<div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>  </div> +<div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>  VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div> +<div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>  </div> +<div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>  VkResult AllocateMemoryOfType(</div> +<div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>  VkDeviceSize size,</div> +<div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>  VkDeviceSize alignment,</div> +<div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>  <span class="keywordtype">bool</span> dedicatedAllocation,</div> +<div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>  VkBuffer dedicatedBuffer,</div> +<div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>  VkBufferUsageFlags dedicatedBufferUsage,</div> +<div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>  VkImage dedicatedImage,</div> +<div class="line"><a name="l08436"></a><span class="lineno"> 8436</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="l08437"></a><span class="lineno"> 8437</span>  uint32_t memTypeIndex,</div> +<div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>  </div> +<div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>  <span class="comment">// Helper function only to be used inside AllocateDedicatedMemory.</span></div> +<div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>  VkResult AllocateDedicatedMemoryPage(</div> +<div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>  VkDeviceSize size,</div> +<div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>  uint32_t memTypeIndex,</div> +<div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>  <span class="keyword">const</span> VkMemoryAllocateInfo& allocInfo,</div> +<div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>  <span class="keywordtype">bool</span> map,</div> +<div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>  <span class="keywordtype">bool</span> isUserDataString,</div> +<div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>  <span class="keywordtype">void</span>* pUserData,</div> +<div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div> +<div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>  </div> +<div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>  <span class="comment">// Allocates and registers new VkDeviceMemory specifically for dedicated allocations.</span></div> +<div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>  VkResult AllocateDedicatedMemory(</div> +<div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>  VkDeviceSize size,</div> +<div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>  VmaSuballocationType suballocType,</div> +<div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>  uint32_t memTypeIndex,</div> +<div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>  <span class="keywordtype">bool</span> withinBudget,</div> +<div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>  <span class="keywordtype">bool</span> map,</div> +<div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>  <span class="keywordtype">bool</span> isUserDataString,</div> +<div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>  <span class="keywordtype">void</span>* pUserData,</div> +<div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>  <span class="keywordtype">float</span> priority,</div> +<div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>  VkBuffer dedicatedBuffer,</div> +<div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>  VkBufferUsageFlags dedicatedBufferUsage,</div> +<div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>  VkImage dedicatedImage,</div> +<div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations);</div> +<div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>  </div> +<div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>  <span class="keywordtype">void</span> FreeDedicatedMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div> +<div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>  </div> +<div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l08472"></a><span class="lineno"> 8472</span> <span class="comment"> Calculates and returns bit mask of memory types that can support defragmentation</span></div> +<div class="line"><a name="l08473"></a><span class="lineno"> 8473</span> <span class="comment"> on GPU as they support creation of required buffer for copy operations.</span></div> +<div class="line"><a name="l08474"></a><span class="lineno"> 8474</span> <span class="comment"> */</span></div> +<div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>  uint32_t CalculateGpuDefragmentationMemoryTypeBits() <span class="keyword">const</span>;</div> +<div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>  </div> +<div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>  uint32_t CalculateGlobalMemoryTypeBits() <span class="keyword">const</span>;</div> +<div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>  </div> +<div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>  <span class="keywordtype">bool</span> GetFlushOrInvalidateRange(</div> +<div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div> +<div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>  VkDeviceSize offset, VkDeviceSize size,</div> +<div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>  VkMappedMemoryRange& outRange) <span class="keyword">const</span>;</div> +<div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>  </div> +<div class="line"><a name="l08484"></a><span class="lineno"> 8484</span> <span class="preprocessor">#if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>  <span class="keywordtype">void</span> UpdateVulkanBudget();</div> +<div class="line"><a name="l08486"></a><span class="lineno"> 8486</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_MEMORY_BUDGET</span></div> +<div class="line"><a name="l08487"></a><span class="lineno"> 8487</span> };</div> +<div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>  </div> +<div class="line"><a name="l08490"></a><span class="lineno"> 8490</span> <span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div> +<div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>  </div> +<div class="line"><a name="l08492"></a><span class="lineno"> 8492</span> <span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div> +<div class="line"><a name="l08493"></a><span class="lineno"> 8493</span> {</div> +<div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>  <span class="keywordflow">return</span> VmaMalloc(&hAllocator->m_AllocationCallbacks, size, alignment);</div> +<div class="line"><a name="l08495"></a><span class="lineno"> 8495</span> }</div> +<div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>  </div> +<div class="line"><a name="l08497"></a><span class="lineno"> 8497</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l08498"></a><span class="lineno"> 8498</span> {</div> +<div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>  VmaFree(&hAllocator->m_AllocationCallbacks, ptr);</div> +<div class="line"><a name="l08500"></a><span class="lineno"> 8500</span> }</div> +<div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>  </div> +<div class="line"><a name="l08502"></a><span class="lineno"> 8502</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l08503"></a><span class="lineno"> 8503</span> <span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> +<div class="line"><a name="l08504"></a><span class="lineno"> 8504</span> {</div> +<div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div> +<div class="line"><a name="l08506"></a><span class="lineno"> 8506</span> }</div> +<div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>  </div> +<div class="line"><a name="l08508"></a><span class="lineno"> 8508</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l08509"></a><span class="lineno"> 8509</span> <span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div> +<div class="line"><a name="l08510"></a><span class="lineno"> 8510</span> {</div> +<div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>  <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div> +<div class="line"><a name="l08512"></a><span class="lineno"> 8512</span> }</div> +<div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>  </div> +<div class="line"><a name="l08514"></a><span class="lineno"> 8514</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l08515"></a><span class="lineno"> 8515</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div> +<div class="line"><a name="l08516"></a><span class="lineno"> 8516</span> {</div> +<div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> +<div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>  {</div> +<div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>  ptr->~T();</div> +<div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>  VmaFree(hAllocator, ptr);</div> +<div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>  }</div> +<div class="line"><a name="l08522"></a><span class="lineno"> 8522</span> }</div> +<div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>  </div> +<div class="line"><a name="l08524"></a><span class="lineno"> 8524</span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l08525"></a><span class="lineno"> 8525</span> <span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div> +<div class="line"><a name="l08526"></a><span class="lineno"> 8526</span> {</div> +<div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>  <span class="keywordflow">if</span>(ptr != VMA_NULL)</div> +<div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>  {</div> +<div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div> +<div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>  ptr[i].~T();</div> +<div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>  VmaFree(hAllocator, ptr);</div> +<div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>  }</div> +<div class="line"><a name="l08533"></a><span class="lineno"> 8533</span> }</div> +<div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>  </div> +<div class="line"><a name="l08536"></a><span class="lineno"> 8536</span> <span class="comment">// VmaStringBuilder</span></div> +<div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>  </div> +<div class="line"><a name="l08538"></a><span class="lineno"> 8538</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>  </div> +<div class="line"><a name="l08540"></a><span class="lineno"> 8540</span> <span class="keyword">class </span>VmaStringBuilder</div> +<div class="line"><a name="l08541"></a><span class="lineno"> 8541</span> {</div> +<div class="line"><a name="l08542"></a><span class="lineno"> 8542</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>  VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator<char>(alloc->GetAllocationCallbacks())) { }</div> +<div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>  <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div> +<div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>  <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div> +<div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>  </div> +<div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>  <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div> +<div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>  <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> +<div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>  <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">'\n'</span>); }</div> +<div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>  <span class="keywordtype">void</span> AddNumber(uint32_t num);</div> +<div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>  <span class="keywordtype">void</span> AddNumber(uint64_t num);</div> +<div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>  <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div> +<div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>  </div> +<div class="line"><a name="l08554"></a><span class="lineno"> 8554</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>  VmaVector< char, VmaStlAllocator<char> > m_Data;</div> +<div class="line"><a name="l08556"></a><span class="lineno"> 8556</span> };</div> +<div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>  </div> +<div class="line"><a name="l08558"></a><span class="lineno"> 8558</span> <span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l08559"></a><span class="lineno"> 8559</span> {</div> +<div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div> +<div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>  <span class="keywordflow">if</span>(strLen > 0)</div> <div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>  {</div> -<div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>  uint32_t mapRefCount = m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div> -<div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>  <span class="keywordflow">if</span>(IsPersistentMap())</div> -<div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>  ++mapRefCount;</div> -<div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>  m_BlockAllocation.m_Block->Unmap(hAllocator, mapRefCount);</div> -<div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>  block->Map(hAllocator, mapRefCount, VMA_NULL);</div> -<div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>  }</div> -<div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>  </div> -<div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>  m_BlockAllocation.m_Block = block;</div> -<div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>  m_BlockAllocation.m_Offset = offset;</div> -<div class="line"><a name="l08572"></a><span class="lineno"> 8572</span> }</div> -<div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>  </div> -<div class="line"><a name="l08574"></a><span class="lineno"> 8574</span> <span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</div> -<div class="line"><a name="l08575"></a><span class="lineno"> 8575</span> {</div> -<div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> -<div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>  m_BlockAllocation.m_Offset = newOffset;</div> -<div class="line"><a name="l08578"></a><span class="lineno"> 8578</span> }</div> -<div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>  </div> -<div class="line"><a name="l08580"></a><span class="lineno"> 8580</span> VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div> -<div class="line"><a name="l08581"></a><span class="lineno"> 8581</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>  <span class="keywordflow">switch</span>(m_Type)</div> -<div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>  {</div> -<div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> -<div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div> -<div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> -<div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>  }</div> -<div class="line"><a name="l08592"></a><span class="lineno"> 8592</span> }</div> -<div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>  </div> -<div class="line"><a name="l08594"></a><span class="lineno"> 8594</span> VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div> -<div class="line"><a name="l08595"></a><span class="lineno"> 8595</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>  <span class="keywordflow">switch</span>(m_Type)</div> -<div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>  {</div> -<div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> -<div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Block->GetDeviceMemory();</div> -<div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> -<div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>  <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div> -<div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>  <span class="keywordflow">return</span> VK_NULL_HANDLE;</div> -<div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>  }</div> -<div class="line"><a name="l08606"></a><span class="lineno"> 8606</span> }</div> -<div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>  </div> -<div class="line"><a name="l08608"></a><span class="lineno"> 8608</span> <span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div> -<div class="line"><a name="l08609"></a><span class="lineno"> 8609</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>  <span class="keywordflow">switch</span>(m_Type)</div> -<div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>  {</div> -<div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> -<div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</div> -<div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>  {</div> -<div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>  <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block->GetMappedData();</div> -<div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>  VMA_ASSERT(pBlockData != VMA_NULL);</div> -<div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>  <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div> -<div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>  }</div> -<div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>  {</div> -<div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>  <span class="keywordflow">return</span> VMA_NULL;</div> -<div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>  }</div> -<div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> -<div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>  VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div> -<div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>  <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div> -<div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>  <span class="keywordflow">return</span> VMA_NULL;</div> -<div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>  }</div> -<div class="line"><a name="l08631"></a><span class="lineno"> 8631</span> }</div> -<div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>  </div> -<div class="line"><a name="l08633"></a><span class="lineno"> 8633</span> <span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div> -<div class="line"><a name="l08634"></a><span class="lineno"> 8634</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>  <span class="keywordflow">switch</span>(m_Type)</div> -<div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>  {</div> -<div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> -<div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div> -<div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> -<div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>  }</div> -<div class="line"><a name="l08645"></a><span class="lineno"> 8645</span> }</div> -<div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>  </div> -<div class="line"><a name="l08647"></a><span class="lineno"> 8647</span> <span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> -<div class="line"><a name="l08648"></a><span class="lineno"> 8648</span> {</div> -<div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>  VMA_ASSERT(CanBecomeLost());</div> -<div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>  </div> -<div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l08652"></a><span class="lineno"> 8652</span> <span class="comment"> Warning: This is a carefully designed algorithm.</span></div> -<div class="line"><a name="l08653"></a><span class="lineno"> 8653</span> <span class="comment"> Do not modify unless you really know what you're doing :)</span></div> -<div class="line"><a name="l08654"></a><span class="lineno"> 8654</span> <span class="comment"> */</span></div> -<div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>  uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div> -<div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>  <span class="keywordflow">for</span>(;;)</div> -<div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>  {</div> -<div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div> -<div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>  {</div> -<div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>  }</div> -<div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount >= currentFrameIndex)</div> -<div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>  {</div> -<div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>  }</div> -<div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div> -<div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>  {</div> -<div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>  <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div> -<div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>  {</div> -<div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>  <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div> -<div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>  <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div> -<div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>  }</div> -<div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>  }</div> -<div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>  }</div> -<div class="line"><a name="l08677"></a><span class="lineno"> 8677</span> }</div> +<div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div> +<div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>  m_Data.resize(oldCount + strLen);</div> +<div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>  memcpy(m_Data.data() + oldCount, pStr, strLen);</div> +<div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>  }</div> +<div class="line"><a name="l08567"></a><span class="lineno"> 8567</span> }</div> +<div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>  </div> +<div class="line"><a name="l08569"></a><span class="lineno"> 8569</span> <span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div> +<div class="line"><a name="l08570"></a><span class="lineno"> 8570</span> {</div> +<div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>  <span class="keywordtype">char</span> buf[11];</div> +<div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>  buf[10] = <span class="charliteral">'\0'</span>;</div> +<div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>  <span class="keywordtype">char</span> *p = &buf[10];</div> +<div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>  <span class="keywordflow">do</span></div> +<div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>  {</div> +<div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>  *--p = <span class="charliteral">'0'</span> + (num % 10);</div> +<div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>  num /= 10;</div> +<div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>  }</div> +<div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>  <span class="keywordflow">while</span>(num);</div> +<div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>  Add(p);</div> +<div class="line"><a name="l08581"></a><span class="lineno"> 8581</span> }</div> +<div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>  </div> +<div class="line"><a name="l08583"></a><span class="lineno"> 8583</span> <span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div> +<div class="line"><a name="l08584"></a><span class="lineno"> 8584</span> {</div> +<div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>  <span class="keywordtype">char</span> buf[21];</div> +<div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>  buf[20] = <span class="charliteral">'\0'</span>;</div> +<div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>  <span class="keywordtype">char</span> *p = &buf[20];</div> +<div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>  <span class="keywordflow">do</span></div> +<div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>  {</div> +<div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>  *--p = <span class="charliteral">'0'</span> + (num % 10);</div> +<div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>  num /= 10;</div> +<div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>  }</div> +<div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>  <span class="keywordflow">while</span>(num);</div> +<div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>  Add(p);</div> +<div class="line"><a name="l08595"></a><span class="lineno"> 8595</span> }</div> +<div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>  </div> +<div class="line"><a name="l08597"></a><span class="lineno"> 8597</span> <span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l08598"></a><span class="lineno"> 8598</span> {</div> +<div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>  <span class="keywordtype">char</span> buf[21];</div> +<div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>  VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div> +<div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>  Add(buf);</div> +<div class="line"><a name="l08602"></a><span class="lineno"> 8602</span> }</div> +<div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>  </div> +<div class="line"><a name="l08604"></a><span class="lineno"> 8604</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>  </div> +<div class="line"><a name="l08607"></a><span class="lineno"> 8607</span> <span class="comment">// VmaJsonWriter</span></div> +<div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>  </div> +<div class="line"><a name="l08609"></a><span class="lineno"> 8609</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>  </div> +<div class="line"><a name="l08611"></a><span class="lineno"> 8611</span> <span class="keyword">class </span>VmaJsonWriter</div> +<div class="line"><a name="l08612"></a><span class="lineno"> 8612</span> {</div> +<div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>  VMA_CLASS_NO_COPY(VmaJsonWriter)</div> +<div class="line"><a name="l08614"></a><span class="lineno"> 8614</span> <span class="keyword">public</span>:</div> +<div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>  VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb);</div> +<div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>  ~VmaJsonWriter();</div> +<div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>  </div> +<div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>  <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div> +<div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>  <span class="keywordtype">void</span> EndObject();</div> +<div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>  </div> +<div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>  <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div> +<div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>  <span class="keywordtype">void</span> EndArray();</div> +<div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>  </div> +<div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>  <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> +<div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>  <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div> +<div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>  <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div> +<div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>  <span class="keywordtype">void</span> ContinueString(uint32_t n);</div> +<div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>  <span class="keywordtype">void</span> ContinueString(uint64_t n);</div> +<div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>  <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div> +<div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>  <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div> +<div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>  </div> +<div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>  <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div> +<div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>  <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div> +<div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>  <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div> +<div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>  <span class="keywordtype">void</span> WriteNull();</div> +<div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>  </div> +<div class="line"><a name="l08637"></a><span class="lineno"> 8637</span> <span class="keyword">private</span>:</div> +<div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div> +<div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>  </div> +<div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>  <span class="keyword">enum</span> COLLECTION_TYPE</div> +<div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>  {</div> +<div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>  COLLECTION_TYPE_OBJECT,</div> +<div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>  COLLECTION_TYPE_ARRAY,</div> +<div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>  };</div> +<div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>  <span class="keyword">struct </span>StackItem</div> +<div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>  {</div> +<div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>  COLLECTION_TYPE type;</div> +<div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>  uint32_t valueCount;</div> +<div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>  <span class="keywordtype">bool</span> singleLineMode;</div> +<div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>  };</div> +<div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>  </div> +<div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>  VmaStringBuilder& m_SB;</div> +<div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>  VmaVector< StackItem, VmaStlAllocator<StackItem> > m_Stack;</div> +<div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>  <span class="keywordtype">bool</span> m_InsideString;</div> +<div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>  </div> +<div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>  <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div> +<div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>  <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div> +<div class="line"><a name="l08658"></a><span class="lineno"> 8658</span> };</div> +<div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>  </div> +<div class="line"><a name="l08660"></a><span class="lineno"> 8660</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">" "</span>;</div> +<div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>  </div> +<div class="line"><a name="l08662"></a><span class="lineno"> 8662</span> VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder& sb) :</div> +<div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>  m_SB(sb),</div> +<div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>  m_Stack(VmaStlAllocator<StackItem>(pAllocationCallbacks)),</div> +<div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>  m_InsideString(false)</div> +<div class="line"><a name="l08666"></a><span class="lineno"> 8666</span> {</div> +<div class="line"><a name="l08667"></a><span class="lineno"> 8667</span> }</div> +<div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>  </div> +<div class="line"><a name="l08669"></a><span class="lineno"> 8669</span> VmaJsonWriter::~VmaJsonWriter()</div> +<div class="line"><a name="l08670"></a><span class="lineno"> 8670</span> {</div> +<div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>  VMA_ASSERT(m_Stack.empty());</div> +<div class="line"><a name="l08673"></a><span class="lineno"> 8673</span> }</div> +<div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>  </div> +<div class="line"><a name="l08675"></a><span class="lineno"> 8675</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div> +<div class="line"><a name="l08676"></a><span class="lineno"> 8676</span> {</div> +<div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>  VMA_ASSERT(!m_InsideString);</div> <div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>  </div> -<div class="line"><a name="l08679"></a><span class="lineno"> 8679</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>  </div> -<div class="line"><a name="l08681"></a><span class="lineno"> 8681</span> <span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div> -<div class="line"><a name="l08682"></a><span class="lineno"> 8682</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div> -<div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>  <span class="stringliteral">"FREE"</span>,</div> -<div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>  <span class="stringliteral">"UNKNOWN"</span>,</div> -<div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>  <span class="stringliteral">"BUFFER"</span>,</div> -<div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>  <span class="stringliteral">"IMAGE_UNKNOWN"</span>,</div> -<div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>  <span class="stringliteral">"IMAGE_LINEAR"</span>,</div> -<div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>  <span class="stringliteral">"IMAGE_OPTIMAL"</span>,</div> -<div class="line"><a name="l08689"></a><span class="lineno"> 8689</span> };</div> -<div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>  </div> -<div class="line"><a name="l08691"></a><span class="lineno"> 8691</span> <span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> -<div class="line"><a name="l08692"></a><span class="lineno"> 8692</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>  json.WriteString(<span class="stringliteral">"Type"</span>);</div> -<div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>  json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div> +<div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>  m_SB.Add(<span class="charliteral">'{'</span>);</div> +<div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>  </div> +<div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>  StackItem item;</div> +<div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>  item.type = COLLECTION_TYPE_OBJECT;</div> +<div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>  item.valueCount = 0;</div> +<div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>  item.singleLineMode = singleLine;</div> +<div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>  m_Stack.push_back(item);</div> +<div class="line"><a name="l08687"></a><span class="lineno"> 8687</span> }</div> +<div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>  </div> +<div class="line"><a name="l08689"></a><span class="lineno"> 8689</span> <span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div> +<div class="line"><a name="l08690"></a><span class="lineno"> 8690</span> {</div> +<div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>  </div> +<div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>  WriteIndent(<span class="keyword">true</span>);</div> +<div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>  m_SB.Add(<span class="charliteral">'}'</span>);</div> <div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>  </div> -<div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div> -<div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>  json.WriteNumber(m_Size);</div> -<div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>  </div> -<div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>  <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div> -<div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>  {</div> -<div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>  json.WriteString(<span class="stringliteral">"UserData"</span>);</div> -<div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>  <span class="keywordflow">if</span>(IsUserDataString())</div> -<div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>  {</div> -<div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>  json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div> -<div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>  }</div> -<div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>  {</div> -<div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>  json.BeginString();</div> -<div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>  json.ContinueString_Pointer(m_pUserData);</div> -<div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>  json.EndString();</div> -<div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>  }</div> -<div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>  }</div> +<div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>  VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div> +<div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>  m_Stack.pop_back();</div> +<div class="line"><a name="l08698"></a><span class="lineno"> 8698</span> }</div> +<div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>  </div> +<div class="line"><a name="l08700"></a><span class="lineno"> 8700</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div> +<div class="line"><a name="l08701"></a><span class="lineno"> 8701</span> {</div> +<div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>  </div> +<div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>  m_SB.Add(<span class="charliteral">'['</span>);</div> +<div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>  </div> +<div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>  StackItem item;</div> +<div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>  item.type = COLLECTION_TYPE_ARRAY;</div> +<div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>  item.valueCount = 0;</div> +<div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>  item.singleLineMode = singleLine;</div> +<div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>  m_Stack.push_back(item);</div> +<div class="line"><a name="l08712"></a><span class="lineno"> 8712</span> }</div> <div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>  </div> -<div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>  json.WriteString(<span class="stringliteral">"CreationFrameIndex"</span>);</div> -<div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>  json.WriteNumber(m_CreationFrameIndex);</div> -<div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>  </div> -<div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>  json.WriteString(<span class="stringliteral">"LastUseFrameIndex"</span>);</div> -<div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>  json.WriteNumber(GetLastUseFrameIndex());</div> -<div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>  </div> -<div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>  <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div> -<div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>  {</div> -<div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>  json.WriteString(<span class="stringliteral">"Usage"</span>);</div> -<div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>  json.WriteNumber(m_BufferImageUsage);</div> -<div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>  }</div> -<div class="line"><a name="l08725"></a><span class="lineno"> 8725</span> }</div> -<div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>  </div> -<div class="line"><a name="l08727"></a><span class="lineno"> 8727</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>  </div> -<div class="line"><a name="l08729"></a><span class="lineno"> 8729</span> <span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> -<div class="line"><a name="l08730"></a><span class="lineno"> 8730</span> {</div> -<div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>  VMA_ASSERT(IsUserDataString());</div> -<div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>  VmaFreeString(hAllocator->GetAllocationCallbacks(), (<span class="keywordtype">char</span>*)m_pUserData);</div> -<div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>  m_pUserData = VMA_NULL;</div> -<div class="line"><a name="l08734"></a><span class="lineno"> 8734</span> }</div> -<div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>  </div> -<div class="line"><a name="l08736"></a><span class="lineno"> 8736</span> <span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div> -<div class="line"><a name="l08737"></a><span class="lineno"> 8737</span> {</div> -<div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div> -<div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>  </div> -<div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) < 0x7F)</div> -<div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>  {</div> -<div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>  ++m_MapCount;</div> -<div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>  }</div> -<div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>  {</div> -<div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>  VMA_ASSERT(0 && <span class="stringliteral">"Allocation mapped too many times simultaneously."</span>);</div> -<div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>  }</div> -<div class="line"><a name="l08748"></a><span class="lineno"> 8748</span> }</div> -<div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>  </div> -<div class="line"><a name="l08750"></a><span class="lineno"> 8750</span> <span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div> -<div class="line"><a name="l08751"></a><span class="lineno"> 8751</span> {</div> -<div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div> -<div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>  </div> -<div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div> -<div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>  {</div> -<div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>  --m_MapCount;</div> -<div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>  }</div> -<div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>  {</div> -<div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unmapping allocation not previously mapped."</span>);</div> -<div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>  }</div> -<div class="line"><a name="l08762"></a><span class="lineno"> 8762</span> }</div> -<div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>  </div> -<div class="line"><a name="l08764"></a><span class="lineno"> 8764</span> VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div> -<div class="line"><a name="l08765"></a><span class="lineno"> 8765</span> {</div> -<div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div> -<div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>  </div> -<div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</div> -<div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>  {</div> -<div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) < 0x7F)</div> -<div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>  {</div> -<div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>  VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div> -<div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>  *ppData = m_DedicatedAllocation.m_pMappedData;</div> -<div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>  ++m_MapCount;</div> -<div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> -<div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>  }</div> -<div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>  {</div> -<div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>  VMA_ASSERT(0 && <span class="stringliteral">"Dedicated allocation mapped too many times simultaneously."</span>);</div> -<div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div> -<div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>  }</div> -<div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>  }</div> -<div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>  {</div> -<div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>  VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(</div> -<div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>  hAllocator->m_hDevice,</div> -<div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>  m_DedicatedAllocation.m_hMemory,</div> -<div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>  0, <span class="comment">// offset</span></div> -<div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>  VK_WHOLE_SIZE,</div> -<div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>  0, <span class="comment">// flags</span></div> -<div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>  ppData);</div> -<div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>  <span class="keywordflow">if</span>(result == VK_SUCCESS)</div> -<div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>  {</div> -<div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>  m_DedicatedAllocation.m_pMappedData = *ppData;</div> -<div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>  m_MapCount = 1;</div> -<div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>  }</div> -<div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>  <span class="keywordflow">return</span> result;</div> -<div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>  }</div> -<div class="line"><a name="l08799"></a><span class="lineno"> 8799</span> }</div> -<div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>  </div> -<div class="line"><a name="l08801"></a><span class="lineno"> 8801</span> <span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> -<div class="line"><a name="l08802"></a><span class="lineno"> 8802</span> {</div> -<div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div> -<div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>  </div> -<div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div> -<div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>  {</div> -<div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>  --m_MapCount;</div> -<div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>  <span class="keywordflow">if</span>(m_MapCount == 0)</div> -<div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>  {</div> -<div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>  m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div> -<div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>  (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(</div> -<div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>  hAllocator->m_hDevice,</div> -<div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>  m_DedicatedAllocation.m_hMemory);</div> -<div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>  }</div> -<div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>  }</div> -<div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>  {</div> -<div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unmapping dedicated allocation not previously mapped."</span>);</div> -<div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>  }</div> -<div class="line"><a name="l08820"></a><span class="lineno"> 8820</span> }</div> -<div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>  </div> -<div class="line"><a name="l08822"></a><span class="lineno"> 8822</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08714"></a><span class="lineno"> 8714</span> <span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div> +<div class="line"><a name="l08715"></a><span class="lineno"> 8715</span> {</div> +<div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>  </div> +<div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>  WriteIndent(<span class="keyword">true</span>);</div> +<div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>  m_SB.Add(<span class="charliteral">']'</span>);</div> +<div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>  </div> +<div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>  VMA_ASSERT(!m_Stack.empty() && m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div> +<div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>  m_Stack.pop_back();</div> +<div class="line"><a name="l08723"></a><span class="lineno"> 8723</span> }</div> +<div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>  </div> +<div class="line"><a name="l08725"></a><span class="lineno"> 8725</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l08726"></a><span class="lineno"> 8726</span> {</div> +<div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>  BeginString(pStr);</div> +<div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>  EndString();</div> +<div class="line"><a name="l08729"></a><span class="lineno"> 8729</span> }</div> +<div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>  </div> +<div class="line"><a name="l08731"></a><span class="lineno"> 8731</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l08732"></a><span class="lineno"> 8732</span> {</div> +<div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>  </div> +<div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>  BeginValue(<span class="keyword">true</span>);</div> +<div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>  m_SB.Add(<span class="charliteral">'"'</span>);</div> +<div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>  m_InsideString = <span class="keyword">true</span>;</div> +<div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>  <span class="keywordflow">if</span>(pStr != VMA_NULL && pStr[0] != <span class="charliteral">'\0'</span>)</div> +<div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>  {</div> +<div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>  ContinueString(pStr);</div> +<div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>  }</div> +<div class="line"><a name="l08742"></a><span class="lineno"> 8742</span> }</div> +<div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>  </div> +<div class="line"><a name="l08744"></a><span class="lineno"> 8744</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l08745"></a><span class="lineno"> 8745</span> {</div> +<div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>  VMA_ASSERT(m_InsideString);</div> +<div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>  </div> +<div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div> +<div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < strLen; ++i)</div> +<div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>  {</div> +<div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>  <span class="keywordtype">char</span> ch = pStr[i];</div> +<div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>  <span class="keywordflow">if</span>(ch == <span class="charliteral">'\\'</span>)</div> +<div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>  {</div> +<div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>  m_SB.Add(<span class="stringliteral">"\\\\"</span>);</div> +<div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>  }</div> +<div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">'"'</span>)</div> +<div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>  {</div> +<div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>  m_SB.Add(<span class="stringliteral">"\\\""</span>);</div> +<div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>  }</div> +<div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch >= 32)</div> +<div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>  {</div> +<div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>  m_SB.Add(ch);</div> +<div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>  }</div> +<div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>  <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div> +<div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>  {</div> +<div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>  <span class="keywordflow">case</span> <span class="charliteral">'\b'</span>:</div> +<div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>  m_SB.Add(<span class="stringliteral">"\\b"</span>);</div> +<div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>  <span class="keywordflow">case</span> <span class="charliteral">'\f'</span>:</div> +<div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>  m_SB.Add(<span class="stringliteral">"\\f"</span>);</div> +<div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>  <span class="keywordflow">case</span> <span class="charliteral">'\n'</span>:</div> +<div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>  m_SB.Add(<span class="stringliteral">"\\n"</span>);</div> +<div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>  <span class="keywordflow">case</span> <span class="charliteral">'\r'</span>:</div> +<div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>  m_SB.Add(<span class="stringliteral">"\\r"</span>);</div> +<div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>  <span class="keywordflow">case</span> <span class="charliteral">'\t'</span>:</div> +<div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>  m_SB.Add(<span class="stringliteral">"\\t"</span>);</div> +<div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>  VMA_ASSERT(0 && <span class="stringliteral">"Character not currently supported."</span>);</div> +<div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>  }</div> +<div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>  }</div> +<div class="line"><a name="l08786"></a><span class="lineno"> 8786</span> }</div> +<div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>  </div> +<div class="line"><a name="l08788"></a><span class="lineno"> 8788</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div> +<div class="line"><a name="l08789"></a><span class="lineno"> 8789</span> {</div> +<div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>  VMA_ASSERT(m_InsideString);</div> +<div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>  m_SB.AddNumber(n);</div> +<div class="line"><a name="l08792"></a><span class="lineno"> 8792</span> }</div> +<div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>  </div> +<div class="line"><a name="l08794"></a><span class="lineno"> 8794</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div> +<div class="line"><a name="l08795"></a><span class="lineno"> 8795</span> {</div> +<div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>  VMA_ASSERT(m_InsideString);</div> +<div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>  m_SB.AddNumber(n);</div> +<div class="line"><a name="l08798"></a><span class="lineno"> 8798</span> }</div> +<div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>  </div> +<div class="line"><a name="l08800"></a><span class="lineno"> 8800</span> <span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div> +<div class="line"><a name="l08801"></a><span class="lineno"> 8801</span> {</div> +<div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>  VMA_ASSERT(m_InsideString);</div> +<div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>  m_SB.AddPointer(ptr);</div> +<div class="line"><a name="l08804"></a><span class="lineno"> 8804</span> }</div> +<div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>  </div> +<div class="line"><a name="l08806"></a><span class="lineno"> 8806</span> <span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div> +<div class="line"><a name="l08807"></a><span class="lineno"> 8807</span> {</div> +<div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>  VMA_ASSERT(m_InsideString);</div> +<div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>  <span class="keywordflow">if</span>(pStr != VMA_NULL && pStr[0] != <span class="charliteral">'\0'</span>)</div> +<div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>  {</div> +<div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>  ContinueString(pStr);</div> +<div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>  }</div> +<div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>  m_SB.Add(<span class="charliteral">'"'</span>);</div> +<div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>  m_InsideString = <span class="keyword">false</span>;</div> +<div class="line"><a name="l08815"></a><span class="lineno"> 8815</span> }</div> +<div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>  </div> +<div class="line"><a name="l08817"></a><span class="lineno"> 8817</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div> +<div class="line"><a name="l08818"></a><span class="lineno"> 8818</span> {</div> +<div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>  m_SB.AddNumber(n);</div> +<div class="line"><a name="l08822"></a><span class="lineno"> 8822</span> }</div> <div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>  </div> -<div class="line"><a name="l08824"></a><span class="lineno"> 8824</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter& json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& stat)</div> +<div class="line"><a name="l08824"></a><span class="lineno"> 8824</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div> <div class="line"><a name="l08825"></a><span class="lineno"> 8825</span> {</div> -<div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>  json.BeginObject();</div> -<div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>  </div> -<div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>  json.WriteString(<span class="stringliteral">"Blocks"</span>);</div> -<div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div> +<div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>  m_SB.AddNumber(n);</div> +<div class="line"><a name="l08829"></a><span class="lineno"> 8829</span> }</div> <div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>  </div> -<div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>  json.WriteString(<span class="stringliteral">"Allocations"</span>);</div> -<div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div> -<div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>  </div> -<div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>  json.WriteString(<span class="stringliteral">"UnusedRanges"</span>);</div> -<div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div> -<div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>  </div> -<div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>  json.WriteString(<span class="stringliteral">"UsedBytes"</span>);</div> -<div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div> -<div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>  </div> -<div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>  json.WriteString(<span class="stringliteral">"UnusedBytes"</span>);</div> -<div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div> -<div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>  </div> -<div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>  <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> > 1)</div> -<div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>  {</div> -<div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>  json.WriteString(<span class="stringliteral">"AllocationSize"</span>);</div> -<div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>  json.BeginObject(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div> -<div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div> -<div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>  json.WriteString(<span class="stringliteral">"Avg"</span>);</div> -<div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div> -<div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div> -<div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div> -<div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>  json.EndObject();</div> -<div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>  }</div> +<div class="line"><a name="l08831"></a><span class="lineno"> 8831</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div> +<div class="line"><a name="l08832"></a><span class="lineno"> 8832</span> {</div> +<div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>  m_SB.Add(b ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);</div> +<div class="line"><a name="l08836"></a><span class="lineno"> 8836</span> }</div> +<div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>  </div> +<div class="line"><a name="l08838"></a><span class="lineno"> 8838</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div> +<div class="line"><a name="l08839"></a><span class="lineno"> 8839</span> {</div> +<div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>  VMA_ASSERT(!m_InsideString);</div> +<div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>  BeginValue(<span class="keyword">false</span>);</div> +<div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>  m_SB.Add(<span class="stringliteral">"null"</span>);</div> +<div class="line"><a name="l08843"></a><span class="lineno"> 8843</span> }</div> +<div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>  </div> +<div class="line"><a name="l08845"></a><span class="lineno"> 8845</span> <span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div> +<div class="line"><a name="l08846"></a><span class="lineno"> 8846</span> {</div> +<div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>  <span class="keywordflow">if</span>(!m_Stack.empty())</div> +<div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>  {</div> +<div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>  StackItem& currItem = m_Stack.back();</div> +<div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>  <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &&</div> +<div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>  currItem.valueCount % 2 == 0)</div> +<div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>  {</div> +<div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>  VMA_ASSERT(isString);</div> +<div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>  }</div> <div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>  </div> -<div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>  <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> > 1)</div> -<div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>  {</div> -<div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>  json.WriteString(<span class="stringliteral">"UnusedRangeSize"</span>);</div> -<div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>  json.BeginObject(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div> -<div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div> -<div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>  json.WriteString(<span class="stringliteral">"Avg"</span>);</div> -<div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div> -<div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div> -<div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div> -<div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>  json.EndObject();</div> -<div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>  }</div> -<div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>  </div> -<div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>  json.EndObject();</div> -<div class="line"><a name="l08870"></a><span class="lineno"> 8870</span> }</div> -<div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>  </div> -<div class="line"><a name="l08872"></a><span class="lineno"> 8872</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>  <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &&</div> +<div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>  currItem.valueCount % 2 != 0)</div> +<div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>  {</div> +<div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>  m_SB.Add(<span class="stringliteral">": "</span>);</div> +<div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>  }</div> +<div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount > 0)</div> +<div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>  {</div> +<div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>  m_SB.Add(<span class="stringliteral">", "</span>);</div> +<div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>  WriteIndent();</div> +<div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>  }</div> +<div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>  {</div> +<div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>  WriteIndent();</div> +<div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>  }</div> +<div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>  ++currItem.valueCount;</div> +<div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>  }</div> +<div class="line"><a name="l08872"></a><span class="lineno"> 8872</span> }</div> <div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>  </div> -<div class="line"><a name="l08874"></a><span class="lineno"> 8874</span> <span class="keyword">struct </span>VmaSuballocationItemSizeLess</div> +<div class="line"><a name="l08874"></a><span class="lineno"> 8874</span> <span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div> <div class="line"><a name="l08875"></a><span class="lineno"> 8875</span> {</div> -<div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>  <span class="keywordtype">bool</span> operator()(</div> -<div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>  <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div> -<div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>  <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div> -<div class="line"><a name="l08879"></a><span class="lineno"> 8879</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>  <span class="keywordflow">return</span> lhs->size < rhs->size;</div> -<div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>  }</div> -<div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>  <span class="keywordtype">bool</span> operator()(</div> -<div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>  <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div> -<div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>  VkDeviceSize rhsSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l08885"></a><span class="lineno"> 8885</span> <span class="keyword"> </span>{</div> -<div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>  <span class="keywordflow">return</span> lhs->size < rhsSize;</div> -<div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>  }</div> -<div class="line"><a name="l08888"></a><span class="lineno"> 8888</span> };</div> -<div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>  </div> -<div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>  </div> -<div class="line"><a name="l08892"></a><span class="lineno"> 8892</span> <span class="comment">// class VmaBlockMetadata</span></div> +<div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>  <span class="keywordflow">if</span>(!m_Stack.empty() && !m_Stack.back().singleLineMode)</div> +<div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>  {</div> +<div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>  m_SB.AddNewLine();</div> +<div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>  </div> +<div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>  <span class="keywordtype">size_t</span> count = m_Stack.size();</div> +<div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>  <span class="keywordflow">if</span>(count > 0 && oneLess)</div> +<div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>  {</div> +<div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>  --count;</div> +<div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>  }</div> +<div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < count; ++i)</div> +<div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>  {</div> +<div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>  m_SB.Add(INDENT);</div> +<div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>  }</div> +<div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>  }</div> +<div class="line"><a name="l08890"></a><span class="lineno"> 8890</span> }</div> +<div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>  </div> +<div class="line"><a name="l08892"></a><span class="lineno"> 8892</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> <div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>  </div> -<div class="line"><a name="l08894"></a><span class="lineno"> 8894</span> VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> -<div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>  m_Size(0),</div> -<div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>  m_pAllocationCallbacks(hAllocator->GetAllocationCallbacks())</div> +<div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>  </div> +<div class="line"><a name="l08896"></a><span class="lineno"> 8896</span> <span class="keywordtype">void</span> VmaAllocation_T::SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData)</div> <div class="line"><a name="l08897"></a><span class="lineno"> 8897</span> {</div> -<div class="line"><a name="l08898"></a><span class="lineno"> 8898</span> }</div> -<div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>  </div> -<div class="line"><a name="l08900"></a><span class="lineno"> 8900</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>  <span class="keywordflow">if</span>(IsUserDataString())</div> +<div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>  {</div> +<div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>  VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div> <div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>  </div> -<div class="line"><a name="l08902"></a><span class="lineno"> 8902</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>  VkDeviceSize unusedBytes,</div> -<div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>  <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div> -<div class="line"><a name="l08906"></a><span class="lineno"> 8906</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>  json.BeginObject();</div> -<div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>  </div> -<div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>  json.WriteString(<span class="stringliteral">"TotalBytes"</span>);</div> -<div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>  json.WriteNumber(GetSize());</div> -<div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>  </div> -<div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>  json.WriteString(<span class="stringliteral">"UnusedBytes"</span>);</div> -<div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>  json.WriteNumber(unusedBytes);</div> +<div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>  FreeUserDataString(hAllocator);</div> +<div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>  </div> +<div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>  <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div> +<div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>  {</div> +<div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>  m_pUserData = VmaCreateStringCopy(hAllocator->GetAllocationCallbacks(), (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div> +<div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>  }</div> +<div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>  }</div> +<div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>  {</div> +<div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>  m_pUserData = pUserData;</div> +<div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>  }</div> +<div class="line"><a name="l08913"></a><span class="lineno"> 8913</span> }</div> <div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>  </div> -<div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>  json.WriteString(<span class="stringliteral">"Allocations"</span>);</div> -<div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>  json.WriteNumber((uint64_t)allocationCount);</div> -<div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>  </div> -<div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>  json.WriteString(<span class="stringliteral">"UnusedRanges"</span>);</div> -<div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>  json.WriteNumber((uint64_t)unusedRangeCount);</div> -<div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>  </div> -<div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>  json.WriteString(<span class="stringliteral">"Suballocations"</span>);</div> -<div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>  json.BeginArray();</div> -<div class="line"><a name="l08923"></a><span class="lineno"> 8923</span> }</div> -<div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>  </div> -<div class="line"><a name="l08925"></a><span class="lineno"> 8925</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div> -<div class="line"><a name="l08928"></a><span class="lineno"> 8928</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>  json.BeginObject(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>  </div> -<div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>  json.WriteString(<span class="stringliteral">"Offset"</span>);</div> -<div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>  json.WriteNumber(offset);</div> -<div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>  </div> -<div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>  hAllocation->PrintParameters(json);</div> -<div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>  </div> -<div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>  json.EndObject();</div> -<div class="line"><a name="l08937"></a><span class="lineno"> 8937</span> }</div> -<div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>  </div> -<div class="line"><a name="l08939"></a><span class="lineno"> 8939</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter& json,</div> -<div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>  VkDeviceSize offset,</div> -<div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>  VkDeviceSize size)<span class="keyword"> const</span></div> -<div class="line"><a name="l08942"></a><span class="lineno"> 8942</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>  json.BeginObject(<span class="keyword">true</span>);</div> -<div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>  </div> -<div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>  json.WriteString(<span class="stringliteral">"Offset"</span>);</div> -<div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>  json.WriteNumber(offset);</div> -<div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>  </div> -<div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>  json.WriteString(<span class="stringliteral">"Type"</span>);</div> -<div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>  json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div> -<div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>  </div> -<div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div> -<div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>  json.WriteNumber(size);</div> -<div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>  </div> -<div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>  json.EndObject();</div> +<div class="line"><a name="l08915"></a><span class="lineno"> 8915</span> <span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div> +<div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>  VmaDeviceMemoryBlock* block,</div> +<div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>  VkDeviceSize offset)</div> +<div class="line"><a name="l08919"></a><span class="lineno"> 8919</span> {</div> +<div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>  VMA_ASSERT(block != VMA_NULL);</div> +<div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> +<div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>  </div> +<div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>  <span class="comment">// Move mapping reference counter from old block to new block.</span></div> +<div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>  <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div> +<div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>  {</div> +<div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>  uint32_t mapRefCount = m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div> +<div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>  <span class="keywordflow">if</span>(IsPersistentMap())</div> +<div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>  ++mapRefCount;</div> +<div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>  m_BlockAllocation.m_Block->Unmap(hAllocator, mapRefCount);</div> +<div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>  block->Map(hAllocator, mapRefCount, VMA_NULL);</div> +<div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>  }</div> +<div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>  </div> +<div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>  m_BlockAllocation.m_Block = block;</div> +<div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>  m_BlockAllocation.m_Offset = offset;</div> +<div class="line"><a name="l08935"></a><span class="lineno"> 8935</span> }</div> +<div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>  </div> +<div class="line"><a name="l08937"></a><span class="lineno"> 8937</span> <span class="keywordtype">void</span> VmaAllocation_T::ChangeOffset(VkDeviceSize newOffset)</div> +<div class="line"><a name="l08938"></a><span class="lineno"> 8938</span> {</div> +<div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>  VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div> +<div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>  m_BlockAllocation.m_Offset = newOffset;</div> +<div class="line"><a name="l08941"></a><span class="lineno"> 8941</span> }</div> +<div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>  </div> +<div class="line"><a name="l08943"></a><span class="lineno"> 8943</span> VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div> +<div class="line"><a name="l08944"></a><span class="lineno"> 8944</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>  <span class="keywordflow">switch</span>(m_Type)</div> +<div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>  {</div> +<div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> +<div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div> +<div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> +<div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>  }</div> <div class="line"><a name="l08955"></a><span class="lineno"> 8955</span> }</div> <div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>  </div> -<div class="line"><a name="l08957"></a><span class="lineno"> 8957</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> +<div class="line"><a name="l08957"></a><span class="lineno"> 8957</span> VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div> <div class="line"><a name="l08958"></a><span class="lineno"> 8958</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>  json.EndArray();</div> -<div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>  json.EndObject();</div> -<div class="line"><a name="l08961"></a><span class="lineno"> 8961</span> }</div> -<div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>  </div> -<div class="line"><a name="l08963"></a><span class="lineno"> 8963</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>  </div> -<div class="line"><a name="l08966"></a><span class="lineno"> 8966</span> <span class="comment">// class VmaBlockMetadata_Generic</span></div> -<div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>  </div> -<div class="line"><a name="l08968"></a><span class="lineno"> 8968</span> VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> -<div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>  VmaBlockMetadata(hAllocator),</div> -<div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>  m_FreeCount(0),</div> -<div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>  m_SumFreeSize(0),</div> -<div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>  m_Suballocations(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> -<div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>  m_FreeSuballocationsBySize(VmaStlAllocator<VmaSuballocationList::iterator>(hAllocator->GetAllocationCallbacks()))</div> -<div class="line"><a name="l08974"></a><span class="lineno"> 8974</span> {</div> -<div class="line"><a name="l08975"></a><span class="lineno"> 8975</span> }</div> -<div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>  </div> -<div class="line"><a name="l08977"></a><span class="lineno"> 8977</span> VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div> -<div class="line"><a name="l08978"></a><span class="lineno"> 8978</span> {</div> -<div class="line"><a name="l08979"></a><span class="lineno"> 8979</span> }</div> -<div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>  </div> -<div class="line"><a name="l08981"></a><span class="lineno"> 8981</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</div> -<div class="line"><a name="l08982"></a><span class="lineno"> 8982</span> {</div> -<div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>  VmaBlockMetadata::Init(size);</div> -<div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>  </div> -<div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>  m_FreeCount = 1;</div> -<div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>  m_SumFreeSize = size;</div> -<div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>  </div> -<div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>  VmaSuballocation suballoc = {};</div> -<div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>  suballoc.offset = 0;</div> -<div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>  suballoc.size = size;</div> -<div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>  </div> -<div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>  VMA_ASSERT(size > VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div> -<div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>  m_Suballocations.push_back(suballoc);</div> -<div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>  VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div> -<div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>  --suballocItem;</div> -<div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>  m_FreeSuballocationsBySize.push_back(suballocItem);</div> -<div class="line"><a name="l08999"></a><span class="lineno"> 8999</span> }</div> -<div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>  </div> -<div class="line"><a name="l09001"></a><span class="lineno"> 9001</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div> -<div class="line"><a name="l09002"></a><span class="lineno"> 9002</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>  VMA_VALIDATE(!m_Suballocations.empty());</div> -<div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>  </div> -<div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>  <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div> -<div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>  VkDeviceSize calculatedOffset = 0;</div> -<div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>  <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div> -<div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>  uint32_t calculatedFreeCount = 0;</div> -<div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>  <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div> -<div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>  VkDeviceSize calculatedSumFreeSize = 0;</div> -<div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>  <span class="comment">// Expected number of free suballocations that should be registered in</span></div> -<div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>  <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div> -<div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>  <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div> -<div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>  <span class="comment">// True if previous visited suballocation was free.</span></div> -<div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>  <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>  </div> -<div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> -<div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>  suballocItem != m_Suballocations.cend();</div> -<div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>  ++suballocItem)</div> +<div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>  <span class="keywordflow">switch</span>(m_Type)</div> +<div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>  {</div> +<div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> +<div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_Block->GetDeviceMemory();</div> +<div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> +<div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>  <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div> +<div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>  <span class="keywordflow">return</span> VK_NULL_HANDLE;</div> +<div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>  }</div> +<div class="line"><a name="l08969"></a><span class="lineno"> 8969</span> }</div> +<div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>  </div> +<div class="line"><a name="l08971"></a><span class="lineno"> 8971</span> <span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div> +<div class="line"><a name="l08972"></a><span class="lineno"> 8972</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>  <span class="keywordflow">switch</span>(m_Type)</div> +<div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>  {</div> +<div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> +<div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</div> +<div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>  {</div> +<div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>  <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block->GetMappedData();</div> +<div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>  VMA_ASSERT(pBlockData != VMA_NULL);</div> +<div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>  <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div> +<div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>  }</div> +<div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>  {</div> +<div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>  <span class="keywordflow">return</span> VMA_NULL;</div> +<div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>  }</div> +<div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> +<div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>  VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div> +<div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>  <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div> +<div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>  <span class="keywordflow">return</span> VMA_NULL;</div> +<div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>  }</div> +<div class="line"><a name="l08994"></a><span class="lineno"> 8994</span> }</div> +<div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>  </div> +<div class="line"><a name="l08996"></a><span class="lineno"> 8996</span> <span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div> +<div class="line"><a name="l08997"></a><span class="lineno"> 8997</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>  <span class="keywordflow">switch</span>(m_Type)</div> +<div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>  {</div> +<div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div> +<div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>  <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div> +<div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>  <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div> +<div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>  }</div> +<div class="line"><a name="l09008"></a><span class="lineno"> 9008</span> }</div> +<div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>  </div> +<div class="line"><a name="l09010"></a><span class="lineno"> 9010</span> <span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> +<div class="line"><a name="l09011"></a><span class="lineno"> 9011</span> {</div> +<div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>  VMA_ASSERT(CanBecomeLost());</div> +<div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>  </div> +<div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l09015"></a><span class="lineno"> 9015</span> <span class="comment"> Warning: This is a carefully designed algorithm.</span></div> +<div class="line"><a name="l09016"></a><span class="lineno"> 9016</span> <span class="comment"> Do not modify unless you really know what you're doing :)</span></div> +<div class="line"><a name="l09017"></a><span class="lineno"> 9017</span> <span class="comment"> */</span></div> +<div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>  uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div> +<div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>  <span class="keywordflow">for</span>(;;)</div> <div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>  {</div> -<div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>  <span class="keyword">const</span> VmaSuballocation& subAlloc = *suballocItem;</div> -<div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>  </div> -<div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>  <span class="comment">// Actual offset of this suballocation doesn't match expected one.</span></div> -<div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>  VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div> -<div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>  </div> -<div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>  <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div> -<div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>  VMA_VALIDATE(!prevFree || !currFree);</div> -<div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>  </div> -<div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>  VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</div> -<div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>  </div> -<div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>  <span class="keywordflow">if</span>(currFree)</div> -<div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>  {</div> -<div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>  calculatedSumFreeSize += subAlloc.size;</div> -<div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>  ++calculatedFreeCount;</div> -<div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>  <span class="keywordflow">if</span>(subAlloc.size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> -<div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>  {</div> -<div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>  ++freeSuballocationsToRegister;</div> -<div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>  }</div> -<div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>  </div> -<div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>  <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div> -<div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>  VMA_VALIDATE(subAlloc.size >= VMA_DEBUG_MARGIN);</div> -<div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>  }</div> -<div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>  {</div> -<div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>  VMA_VALIDATE(subAlloc.hAllocation->GetOffset() == subAlloc.offset);</div> -<div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>  VMA_VALIDATE(subAlloc.hAllocation->GetSize() == subAlloc.size);</div> -<div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>  </div> -<div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>  <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div> -<div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>  VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</div> -<div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>  }</div> -<div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>  </div> -<div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>  calculatedOffset += subAlloc.size;</div> -<div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>  prevFree = currFree;</div> -<div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>  }</div> -<div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>  </div> -<div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>  <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn't</span></div> -<div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>  <span class="comment">// match expected one.</span></div> -<div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>  VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</div> -<div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>  </div> -<div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>  VkDeviceSize lastSize = 0;</div> -<div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_FreeSuballocationsBySize.size(); ++i)</div> +<div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>  <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div> +<div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>  {</div> +<div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>  }</div> +<div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount >= currentFrameIndex)</div> +<div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>  {</div> +<div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>  }</div> +<div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>  <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div> +<div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>  {</div> +<div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>  <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div> +<div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>  {</div> +<div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>  <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div> +<div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>  <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div> +<div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>  }</div> +<div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>  }</div> +<div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>  }</div> +<div class="line"><a name="l09040"></a><span class="lineno"> 9040</span> }</div> +<div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>  </div> +<div class="line"><a name="l09042"></a><span class="lineno"> 9042</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>  </div> +<div class="line"><a name="l09044"></a><span class="lineno"> 9044</span> <span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div> +<div class="line"><a name="l09045"></a><span class="lineno"> 9045</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div> +<div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>  <span class="stringliteral">"FREE"</span>,</div> +<div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>  <span class="stringliteral">"UNKNOWN"</span>,</div> +<div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>  <span class="stringliteral">"BUFFER"</span>,</div> +<div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>  <span class="stringliteral">"IMAGE_UNKNOWN"</span>,</div> +<div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>  <span class="stringliteral">"IMAGE_LINEAR"</span>,</div> +<div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>  <span class="stringliteral">"IMAGE_OPTIMAL"</span>,</div> +<div class="line"><a name="l09052"></a><span class="lineno"> 9052</span> };</div> +<div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>  </div> +<div class="line"><a name="l09054"></a><span class="lineno"> 9054</span> <span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> +<div class="line"><a name="l09055"></a><span class="lineno"> 9055</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>  json.WriteString(<span class="stringliteral">"Type"</span>);</div> +<div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>  json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div> +<div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>  </div> +<div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div> +<div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>  json.WriteNumber(m_Size);</div> +<div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>  </div> +<div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>  <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div> <div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>  {</div> -<div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>  VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div> -<div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>  </div> -<div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>  <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div> -<div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>  VMA_VALIDATE(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>  <span class="comment">// They must be sorted by size ascending.</span></div> -<div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>  VMA_VALIDATE(suballocItem->size >= lastSize);</div> -<div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>  </div> -<div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>  lastSize = suballocItem->size;</div> -<div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>  }</div> -<div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>  </div> -<div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>  <span class="comment">// Check if totals match calculacted values.</span></div> -<div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>  VMA_VALIDATE(ValidateFreeSuballocationList());</div> -<div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>  VMA_VALIDATE(calculatedOffset == GetSize());</div> -<div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>  VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div> -<div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>  VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div> +<div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>  json.WriteString(<span class="stringliteral">"UserData"</span>);</div> +<div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>  <span class="keywordflow">if</span>(IsUserDataString())</div> +<div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>  {</div> +<div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>  json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div> +<div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>  }</div> +<div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>  {</div> +<div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>  json.BeginString();</div> +<div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>  json.ContinueString_Pointer(m_pUserData);</div> +<div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>  json.EndString();</div> +<div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>  }</div> +<div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>  }</div> +<div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>  </div> +<div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>  json.WriteString(<span class="stringliteral">"CreationFrameIndex"</span>);</div> +<div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>  json.WriteNumber(m_CreationFrameIndex);</div> <div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>  </div> -<div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09081"></a><span class="lineno"> 9081</span> }</div> +<div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>  json.WriteString(<span class="stringliteral">"LastUseFrameIndex"</span>);</div> +<div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>  json.WriteNumber(GetLastUseFrameIndex());</div> <div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>  </div> -<div class="line"><a name="l09083"></a><span class="lineno"> 9083</span> VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> -<div class="line"><a name="l09084"></a><span class="lineno"> 9084</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>  <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div> -<div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>  {</div> -<div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>  <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()->size;</div> -<div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>  }</div> -<div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>  {</div> -<div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>  }</div> -<div class="line"><a name="l09093"></a><span class="lineno"> 9093</span> }</div> -<div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>  </div> -<div class="line"><a name="l09095"></a><span class="lineno"> 9095</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div> -<div class="line"><a name="l09096"></a><span class="lineno"> 9096</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>  <span class="keywordflow">return</span> (m_Suballocations.size() == 1) && (m_FreeCount == 1);</div> -<div class="line"><a name="l09098"></a><span class="lineno"> 9098</span> }</div> -<div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>  </div> -<div class="line"><a name="l09100"></a><span class="lineno"> 9100</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> -<div class="line"><a name="l09101"></a><span class="lineno"> 9101</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> -<div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>  </div> -<div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>  <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div> -<div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div> -<div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div> -<div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>  </div> -<div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div> -<div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> -<div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>  </div> -<div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div> -<div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> -<div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>  </div> -<div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> -<div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>  suballocItem != m_Suballocations.cend();</div> -<div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>  ++suballocItem)</div> -<div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>  {</div> -<div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = *suballocItem;</div> -<div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>  {</div> -<div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> -<div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> -<div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>  }</div> -<div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>  {</div> -<div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div> -<div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div> -<div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>  }</div> -<div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>  }</div> -<div class="line"><a name="l09132"></a><span class="lineno"> 9132</span> }</div> -<div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>  </div> -<div class="line"><a name="l09134"></a><span class="lineno"> 9134</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> -<div class="line"><a name="l09135"></a><span class="lineno"> 9135</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>  <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div> -<div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>  </div> -<div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div> -<div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div> -<div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div> -<div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div> -<div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div> -<div class="line"><a name="l09143"></a><span class="lineno"> 9143</span> }</div> -<div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>  </div> -<div class="line"><a name="l09145"></a><span class="lineno"> 9145</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>  </div> -<div class="line"><a name="l09147"></a><span class="lineno"> 9147</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> -<div class="line"><a name="l09148"></a><span class="lineno"> 9148</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>  PrintDetailedMap_Begin(json,</div> -<div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>  m_SumFreeSize, <span class="comment">// unusedBytes</span></div> -<div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>  m_Suballocations.size() - (<span class="keywordtype">size_t</span>)m_FreeCount, <span class="comment">// allocationCount</span></div> -<div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>  m_FreeCount); <span class="comment">// unusedRangeCount</span></div> -<div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>  </div> -<div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>  <span class="keywordtype">size_t</span> i = 0;</div> -<div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> -<div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>  suballocItem != m_Suballocations.cend();</div> -<div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>  ++suballocItem, ++i)</div> -<div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>  {</div> -<div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>  <span class="keywordflow">if</span>(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>  {</div> -<div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>  PrintDetailedMap_UnusedRange(json, suballocItem->offset, suballocItem->size);</div> -<div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>  }</div> -<div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>  {</div> -<div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>  PrintDetailedMap_Allocation(json, suballocItem->offset, suballocItem->hAllocation);</div> -<div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>  }</div> -<div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>  }</div> -<div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>  </div> -<div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>  PrintDetailedMap_End(json);</div> -<div class="line"><a name="l09170"></a><span class="lineno"> 9170</span> }</div> -<div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>  </div> -<div class="line"><a name="l09172"></a><span class="lineno"> 9172</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>  </div> -<div class="line"><a name="l09174"></a><span class="lineno"> 9174</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div> -<div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>  uint32_t strategy,</div> -<div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l09185"></a><span class="lineno"> 9185</span> {</div> -<div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>  VMA_ASSERT(allocSize > 0);</div> -<div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>  VMA_ASSERT(!upperAddress);</div> -<div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>  VMA_ASSERT(pAllocationRequest != VMA_NULL);</div> -<div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>  VMA_HEAVY_ASSERT(Validate());</div> -<div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>  </div> -<div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>  pAllocationRequest->type = VmaAllocationRequestType::Normal;</div> +<div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>  <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div> +<div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>  {</div> +<div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>  json.WriteString(<span class="stringliteral">"Usage"</span>);</div> +<div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>  json.WriteNumber(m_BufferImageUsage);</div> +<div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>  }</div> +<div class="line"><a name="l09088"></a><span class="lineno"> 9088</span> }</div> +<div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>  </div> +<div class="line"><a name="l09090"></a><span class="lineno"> 9090</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>  </div> +<div class="line"><a name="l09092"></a><span class="lineno"> 9092</span> <span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> +<div class="line"><a name="l09093"></a><span class="lineno"> 9093</span> {</div> +<div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>  VMA_ASSERT(IsUserDataString());</div> +<div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>  VmaFreeString(hAllocator->GetAllocationCallbacks(), (<span class="keywordtype">char</span>*)m_pUserData);</div> +<div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>  m_pUserData = VMA_NULL;</div> +<div class="line"><a name="l09097"></a><span class="lineno"> 9097</span> }</div> +<div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>  </div> +<div class="line"><a name="l09099"></a><span class="lineno"> 9099</span> <span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div> +<div class="line"><a name="l09100"></a><span class="lineno"> 9100</span> {</div> +<div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div> +<div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>  </div> +<div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) < 0x7F)</div> +<div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>  {</div> +<div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>  ++m_MapCount;</div> +<div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>  }</div> +<div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>  {</div> +<div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>  VMA_ASSERT(0 && <span class="stringliteral">"Allocation mapped too many times simultaneously."</span>);</div> +<div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>  }</div> +<div class="line"><a name="l09111"></a><span class="lineno"> 9111</span> }</div> +<div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>  </div> +<div class="line"><a name="l09113"></a><span class="lineno"> 9113</span> <span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div> +<div class="line"><a name="l09114"></a><span class="lineno"> 9114</span> {</div> +<div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div> +<div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>  </div> +<div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div> +<div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>  {</div> +<div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>  --m_MapCount;</div> +<div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>  }</div> +<div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>  {</div> +<div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unmapping allocation not previously mapped."</span>);</div> +<div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>  }</div> +<div class="line"><a name="l09125"></a><span class="lineno"> 9125</span> }</div> +<div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>  </div> +<div class="line"><a name="l09127"></a><span class="lineno"> 9127</span> VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div> +<div class="line"><a name="l09128"></a><span class="lineno"> 9128</span> {</div> +<div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>  </div> +<div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</div> +<div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>  {</div> +<div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) < 0x7F)</div> +<div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>  {</div> +<div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>  VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div> +<div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>  *ppData = m_DedicatedAllocation.m_pMappedData;</div> +<div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>  ++m_MapCount;</div> +<div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> +<div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>  }</div> +<div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>  {</div> +<div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>  VMA_ASSERT(0 && <span class="stringliteral">"Dedicated allocation mapped too many times simultaneously."</span>);</div> +<div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>  <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div> +<div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>  }</div> +<div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>  }</div> +<div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>  {</div> +<div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>  VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(</div> +<div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>  hAllocator->m_hDevice,</div> +<div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>  m_DedicatedAllocation.m_hMemory,</div> +<div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>  0, <span class="comment">// offset</span></div> +<div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>  VK_WHOLE_SIZE,</div> +<div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>  0, <span class="comment">// flags</span></div> +<div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>  ppData);</div> +<div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>  <span class="keywordflow">if</span>(result == VK_SUCCESS)</div> +<div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>  {</div> +<div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>  m_DedicatedAllocation.m_pMappedData = *ppData;</div> +<div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>  m_MapCount = 1;</div> +<div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>  }</div> +<div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>  }</div> +<div class="line"><a name="l09162"></a><span class="lineno"> 9162</span> }</div> +<div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>  </div> +<div class="line"><a name="l09164"></a><span class="lineno"> 9164</span> <span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div> +<div class="line"><a name="l09165"></a><span class="lineno"> 9165</span> {</div> +<div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>  VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div> +<div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>  </div> +<div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>  <span class="keywordflow">if</span>((m_MapCount & ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div> +<div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>  {</div> +<div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>  --m_MapCount;</div> +<div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>  <span class="keywordflow">if</span>(m_MapCount == 0)</div> +<div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>  {</div> +<div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>  m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div> +<div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>  (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(</div> +<div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>  hAllocator->m_hDevice,</div> +<div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>  m_DedicatedAllocation.m_hMemory);</div> +<div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>  }</div> +<div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>  }</div> +<div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>  {</div> +<div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>  VMA_ASSERT(0 && <span class="stringliteral">"Unmapping dedicated allocation not previously mapped."</span>);</div> +<div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>  }</div> +<div class="line"><a name="l09183"></a><span class="lineno"> 9183</span> }</div> +<div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>  </div> +<div class="line"><a name="l09185"></a><span class="lineno"> 9185</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>  </div> +<div class="line"><a name="l09187"></a><span class="lineno"> 9187</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter& json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& stat)</div> +<div class="line"><a name="l09188"></a><span class="lineno"> 9188</span> {</div> +<div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>  json.BeginObject();</div> +<div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>  </div> +<div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>  json.WriteString(<span class="stringliteral">"Blocks"</span>);</div> +<div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div> <div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>  </div> -<div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>  <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div> -<div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>  <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &&</div> -<div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>  m_SumFreeSize < allocSize + 2 * VMA_DEBUG_MARGIN)</div> -<div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>  {</div> -<div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>  }</div> -<div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>  </div> -<div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>  <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div> -<div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div> -<div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>  <span class="keywordflow">if</span>(freeSuballocCount > 0)</div> -<div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>  {</div> -<div class="line"><a name="l09205"></a><span class="lineno"> 9205</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="l09206"></a><span class="lineno"> 9206</span>  {</div> -<div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>  <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div> -<div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>  VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>  m_FreeSuballocationsBySize.data(),</div> -<div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>  m_FreeSuballocationsBySize.data() + freeSuballocCount,</div> -<div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>  allocSize + 2 * VMA_DEBUG_MARGIN,</div> -<div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>  VmaSuballocationItemSizeLess());</div> -<div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>  <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div> -<div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>  <span class="keywordflow">for</span>(; index < freeSuballocCount; ++index)</div> -<div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>  {</div> -<div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> -<div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>  currentFrameIndex,</div> -<div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>  frameInUseCount,</div> -<div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>  bufferImageGranularity,</div> -<div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>  allocSize,</div> -<div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>  allocAlignment,</div> -<div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>  allocType,</div> -<div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>  m_FreeSuballocationsBySize[index],</div> -<div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> -<div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>  &pAllocationRequest->offset,</div> -<div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>  &pAllocationRequest->itemsToMakeLostCount,</div> -<div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>  &pAllocationRequest->sumFreeSize,</div> -<div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>  &pAllocationRequest->sumItemSize))</div> -<div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>  {</div> -<div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>  pAllocationRequest->item = m_FreeSuballocationsBySize[index];</div> -<div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>  }</div> -<div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>  }</div> -<div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>  }</div> -<div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET)</div> -<div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>  {</div> -<div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> -<div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>  it != m_Suballocations.end();</div> -<div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>  ++it)</div> -<div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>  {</div> -<div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>  <span class="keywordflow">if</span>(it->type == VMA_SUBALLOCATION_TYPE_FREE && CheckAllocation(</div> -<div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>  currentFrameIndex,</div> -<div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>  frameInUseCount,</div> -<div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>  bufferImageGranularity,</div> -<div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>  allocSize,</div> -<div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>  allocAlignment,</div> -<div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>  allocType,</div> -<div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>  it,</div> -<div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> -<div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>  &pAllocationRequest->offset,</div> -<div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>  &pAllocationRequest->itemsToMakeLostCount,</div> -<div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>  &pAllocationRequest->sumFreeSize,</div> -<div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>  &pAllocationRequest->sumItemSize))</div> -<div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>  {</div> -<div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>  pAllocationRequest->item = it;</div> -<div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>  }</div> -<div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>  }</div> -<div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>  }</div> -<div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div> -<div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>  {</div> -<div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>  <span class="comment">// Search staring from biggest suballocations.</span></div> -<div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div> -<div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>  {</div> -<div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> -<div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>  currentFrameIndex,</div> -<div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>  frameInUseCount,</div> -<div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>  bufferImageGranularity,</div> -<div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>  allocSize,</div> -<div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>  allocAlignment,</div> -<div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>  allocType,</div> -<div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>  m_FreeSuballocationsBySize[index],</div> -<div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> -<div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>  &pAllocationRequest->offset,</div> -<div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>  &pAllocationRequest->itemsToMakeLostCount,</div> -<div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>  &pAllocationRequest->sumFreeSize,</div> -<div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>  &pAllocationRequest->sumItemSize))</div> -<div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>  {</div> -<div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>  pAllocationRequest->item = m_FreeSuballocationsBySize[index];</div> -<div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>  }</div> -<div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>  }</div> -<div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>  }</div> -<div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>  }</div> -<div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>  </div> -<div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> -<div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>  {</div> -<div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>  <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div> -<div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>  </div> -<div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>  <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>  VmaAllocationRequest tmpAllocRequest = {};</div> -<div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>  tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div> -<div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div> -<div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>  suballocIt != m_Suballocations.end();</div> -<div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>  ++suballocIt)</div> -<div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>  {</div> -<div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>  <span class="keywordflow">if</span>(suballocIt->type == VMA_SUBALLOCATION_TYPE_FREE ||</div> -<div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>  suballocIt->hAllocation->CanBecomeLost())</div> -<div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>  {</div> -<div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> -<div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>  currentFrameIndex,</div> -<div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>  frameInUseCount,</div> -<div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>  bufferImageGranularity,</div> -<div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>  allocSize,</div> -<div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>  allocAlignment,</div> -<div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>  allocType,</div> -<div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>  suballocIt,</div> -<div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>  canMakeOtherLost,</div> -<div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>  &tmpAllocRequest.offset,</div> -<div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>  &tmpAllocRequest.itemsToMakeLostCount,</div> -<div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>  &tmpAllocRequest.sumFreeSize,</div> -<div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>  &tmpAllocRequest.sumItemSize))</div> -<div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>  {</div> -<div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>  <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div> -<div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>  {</div> -<div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>  *pAllocationRequest = tmpAllocRequest;</div> -<div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>  pAllocationRequest->item = suballocIt;</div> -<div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>  }</div> -<div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>  <span class="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() < pAllocationRequest->CalcCost())</div> -<div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>  {</div> -<div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>  *pAllocationRequest = tmpAllocRequest;</div> -<div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>  pAllocationRequest->item = suballocIt;</div> -<div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>  found = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>  }</div> -<div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>  }</div> -<div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>  }</div> -<div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>  }</div> -<div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>  </div> -<div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>  <span class="keywordflow">return</span> found;</div> -<div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>  }</div> -<div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>  </div> -<div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09334"></a><span class="lineno"> 9334</span> }</div> -<div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>  </div> -<div class="line"><a name="l09336"></a><span class="lineno"> 9336</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l09340"></a><span class="lineno"> 9340</span> {</div> -<div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>  VMA_ASSERT(pAllocationRequest && pAllocationRequest->type == VmaAllocationRequestType::Normal);</div> -<div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>  </div> -<div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>  <span class="keywordflow">while</span>(pAllocationRequest->itemsToMakeLostCount > 0)</div> -<div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>  {</div> -<div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>  <span class="keywordflow">if</span>(pAllocationRequest->item->type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>  {</div> -<div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>  ++pAllocationRequest->item;</div> -<div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>  }</div> -<div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>  VMA_ASSERT(pAllocationRequest->item != m_Suballocations.end());</div> -<div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>  VMA_ASSERT(pAllocationRequest->item->hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>  VMA_ASSERT(pAllocationRequest->item->hAllocation->CanBecomeLost());</div> -<div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>  <span class="keywordflow">if</span>(pAllocationRequest->item->hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> -<div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>  {</div> -<div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>  pAllocationRequest->item = FreeSuballocation(pAllocationRequest->item);</div> -<div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>  --pAllocationRequest->itemsToMakeLostCount;</div> -<div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>  }</div> -<div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>  {</div> -<div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>  }</div> -<div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>  }</div> -<div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>  </div> -<div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>  VMA_HEAVY_ASSERT(Validate());</div> -<div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>  VMA_ASSERT(pAllocationRequest->item != m_Suballocations.end());</div> -<div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>  VMA_ASSERT(pAllocationRequest->item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>  </div> -<div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09368"></a><span class="lineno"> 9368</span> }</div> -<div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>  </div> -<div class="line"><a name="l09370"></a><span class="lineno"> 9370</span> uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> -<div class="line"><a name="l09371"></a><span class="lineno"> 9371</span> {</div> -<div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>  uint32_t lostAllocationCount = 0;</div> -<div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> -<div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>  it != m_Suballocations.end();</div> -<div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>  ++it)</div> -<div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>  {</div> -<div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE &&</div> -<div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>  it->hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>  it->hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> -<div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>  {</div> -<div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>  it = FreeSuballocation(it);</div> -<div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>  ++lostAllocationCount;</div> -<div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>  }</div> -<div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>  }</div> -<div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>  <span class="keywordflow">return</span> lostAllocationCount;</div> -<div class="line"><a name="l09386"></a><span class="lineno"> 9386</span> }</div> -<div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>  </div> -<div class="line"><a name="l09388"></a><span class="lineno"> 9388</span> VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div> -<div class="line"><a name="l09389"></a><span class="lineno"> 9389</span> {</div> -<div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> -<div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>  it != m_Suballocations.end();</div> -<div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>  ++it)</div> -<div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>  {</div> -<div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>  {</div> -<div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it->offset - VMA_DEBUG_MARGIN))</div> -<div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>  {</div> -<div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>  }</div> -<div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it->offset + it->size))</div> -<div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>  {</div> -<div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>  }</div> +<div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>  json.WriteString(<span class="stringliteral">"Allocations"</span>);</div> +<div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div> +<div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>  </div> +<div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>  json.WriteString(<span class="stringliteral">"UnusedRanges"</span>);</div> +<div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div> +<div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>  </div> +<div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>  json.WriteString(<span class="stringliteral">"UsedBytes"</span>);</div> +<div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div> +<div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>  </div> +<div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>  json.WriteString(<span class="stringliteral">"UnusedBytes"</span>);</div> +<div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div> +<div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>  </div> +<div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>  <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> > 1)</div> +<div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>  {</div> +<div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>  json.WriteString(<span class="stringliteral">"AllocationSize"</span>);</div> +<div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>  json.BeginObject(<span class="keyword">true</span>);</div> +<div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div> +<div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div> +<div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>  json.WriteString(<span class="stringliteral">"Avg"</span>);</div> +<div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div> +<div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div> +<div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div> +<div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>  json.EndObject();</div> +<div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>  }</div> +<div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>  </div> +<div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>  <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> > 1)</div> +<div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>  {</div> +<div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>  json.WriteString(<span class="stringliteral">"UnusedRangeSize"</span>);</div> +<div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>  json.BeginObject(<span class="keyword">true</span>);</div> +<div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>  json.WriteString(<span class="stringliteral">"Min"</span>);</div> +<div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div> +<div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>  json.WriteString(<span class="stringliteral">"Avg"</span>);</div> +<div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div> +<div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>  json.WriteString(<span class="stringliteral">"Max"</span>);</div> +<div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>  json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div> +<div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>  json.EndObject();</div> +<div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>  }</div> +<div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>  </div> +<div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>  json.EndObject();</div> +<div class="line"><a name="l09233"></a><span class="lineno"> 9233</span> }</div> +<div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>  </div> +<div class="line"><a name="l09235"></a><span class="lineno"> 9235</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>  </div> +<div class="line"><a name="l09237"></a><span class="lineno"> 9237</span> <span class="keyword">struct </span>VmaSuballocationItemSizeLess</div> +<div class="line"><a name="l09238"></a><span class="lineno"> 9238</span> {</div> +<div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>  <span class="keywordtype">bool</span> operator()(</div> +<div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>  <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div> +<div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>  <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div> +<div class="line"><a name="l09242"></a><span class="lineno"> 9242</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>  <span class="keywordflow">return</span> lhs->size < rhs->size;</div> +<div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>  }</div> +<div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>  <span class="keywordtype">bool</span> operator()(</div> +<div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>  <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div> +<div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>  VkDeviceSize rhsSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l09248"></a><span class="lineno"> 9248</span> <span class="keyword"> </span>{</div> +<div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>  <span class="keywordflow">return</span> lhs->size < rhsSize;</div> +<div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>  }</div> +<div class="line"><a name="l09251"></a><span class="lineno"> 9251</span> };</div> +<div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>  </div> +<div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>  </div> +<div class="line"><a name="l09255"></a><span class="lineno"> 9255</span> <span class="comment">// class VmaBlockMetadata</span></div> +<div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>  </div> +<div class="line"><a name="l09257"></a><span class="lineno"> 9257</span> VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> +<div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>  m_Size(0),</div> +<div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>  m_pAllocationCallbacks(hAllocator->GetAllocationCallbacks())</div> +<div class="line"><a name="l09260"></a><span class="lineno"> 9260</span> {</div> +<div class="line"><a name="l09261"></a><span class="lineno"> 9261</span> }</div> +<div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>  </div> +<div class="line"><a name="l09263"></a><span class="lineno"> 9263</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>  </div> +<div class="line"><a name="l09265"></a><span class="lineno"> 9265</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>  VkDeviceSize unusedBytes,</div> +<div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>  <span class="keywordtype">size_t</span> allocationCount,</div> +<div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>  <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div> +<div class="line"><a name="l09269"></a><span class="lineno"> 9269</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>  json.BeginObject();</div> +<div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>  </div> +<div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>  json.WriteString(<span class="stringliteral">"TotalBytes"</span>);</div> +<div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>  json.WriteNumber(GetSize());</div> +<div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>  </div> +<div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>  json.WriteString(<span class="stringliteral">"UnusedBytes"</span>);</div> +<div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>  json.WriteNumber(unusedBytes);</div> +<div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>  </div> +<div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>  json.WriteString(<span class="stringliteral">"Allocations"</span>);</div> +<div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>  json.WriteNumber((uint64_t)allocationCount);</div> +<div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>  </div> +<div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>  json.WriteString(<span class="stringliteral">"UnusedRanges"</span>);</div> +<div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>  json.WriteNumber((uint64_t)unusedRangeCount);</div> +<div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>  </div> +<div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>  json.WriteString(<span class="stringliteral">"Suballocations"</span>);</div> +<div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>  json.BeginArray();</div> +<div class="line"><a name="l09286"></a><span class="lineno"> 9286</span> }</div> +<div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>  </div> +<div class="line"><a name="l09288"></a><span class="lineno"> 9288</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div> +<div class="line"><a name="l09291"></a><span class="lineno"> 9291</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>  json.BeginObject(<span class="keyword">true</span>);</div> +<div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>  </div> +<div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>  json.WriteString(<span class="stringliteral">"Offset"</span>);</div> +<div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>  json.WriteNumber(offset);</div> +<div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>  </div> +<div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>  hAllocation->PrintParameters(json);</div> +<div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>  </div> +<div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>  json.EndObject();</div> +<div class="line"><a name="l09300"></a><span class="lineno"> 9300</span> }</div> +<div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>  </div> +<div class="line"><a name="l09302"></a><span class="lineno"> 9302</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter& json,</div> +<div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>  VkDeviceSize offset,</div> +<div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>  VkDeviceSize size)<span class="keyword"> const</span></div> +<div class="line"><a name="l09305"></a><span class="lineno"> 9305</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>  json.BeginObject(<span class="keyword">true</span>);</div> +<div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>  </div> +<div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>  json.WriteString(<span class="stringliteral">"Offset"</span>);</div> +<div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>  json.WriteNumber(offset);</div> +<div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>  </div> +<div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>  json.WriteString(<span class="stringliteral">"Type"</span>);</div> +<div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>  json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div> +<div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>  </div> +<div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>  json.WriteString(<span class="stringliteral">"Size"</span>);</div> +<div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>  json.WriteNumber(size);</div> +<div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>  </div> +<div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>  json.EndObject();</div> +<div class="line"><a name="l09318"></a><span class="lineno"> 9318</span> }</div> +<div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>  </div> +<div class="line"><a name="l09320"></a><span class="lineno"> 9320</span> <span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> +<div class="line"><a name="l09321"></a><span class="lineno"> 9321</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>  json.EndArray();</div> +<div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>  json.EndObject();</div> +<div class="line"><a name="l09324"></a><span class="lineno"> 9324</span> }</div> +<div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>  </div> +<div class="line"><a name="l09326"></a><span class="lineno"> 9326</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>  </div> +<div class="line"><a name="l09329"></a><span class="lineno"> 9329</span> <span class="comment">// class VmaBlockMetadata_Generic</span></div> +<div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>  </div> +<div class="line"><a name="l09331"></a><span class="lineno"> 9331</span> VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> +<div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>  VmaBlockMetadata(hAllocator),</div> +<div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>  m_FreeCount(0),</div> +<div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>  m_SumFreeSize(0),</div> +<div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>  m_Suballocations(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> +<div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>  m_FreeSuballocationsBySize(VmaStlAllocator<VmaSuballocationList::iterator>(hAllocator->GetAllocationCallbacks()))</div> +<div class="line"><a name="l09337"></a><span class="lineno"> 9337</span> {</div> +<div class="line"><a name="l09338"></a><span class="lineno"> 9338</span> }</div> +<div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>  </div> +<div class="line"><a name="l09340"></a><span class="lineno"> 9340</span> VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div> +<div class="line"><a name="l09341"></a><span class="lineno"> 9341</span> {</div> +<div class="line"><a name="l09342"></a><span class="lineno"> 9342</span> }</div> +<div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>  </div> +<div class="line"><a name="l09344"></a><span class="lineno"> 9344</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</div> +<div class="line"><a name="l09345"></a><span class="lineno"> 9345</span> {</div> +<div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>  VmaBlockMetadata::Init(size);</div> +<div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>  </div> +<div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>  m_FreeCount = 1;</div> +<div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>  m_SumFreeSize = size;</div> +<div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>  </div> +<div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>  VmaSuballocation suballoc = {};</div> +<div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>  suballoc.offset = 0;</div> +<div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>  suballoc.size = size;</div> +<div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>  </div> +<div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>  VMA_ASSERT(size > VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div> +<div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>  m_Suballocations.push_back(suballoc);</div> +<div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>  VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div> +<div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>  --suballocItem;</div> +<div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>  m_FreeSuballocationsBySize.push_back(suballocItem);</div> +<div class="line"><a name="l09362"></a><span class="lineno"> 9362</span> }</div> +<div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>  </div> +<div class="line"><a name="l09364"></a><span class="lineno"> 9364</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div> +<div class="line"><a name="l09365"></a><span class="lineno"> 9365</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>  VMA_VALIDATE(!m_Suballocations.empty());</div> +<div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>  </div> +<div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>  <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div> +<div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>  VkDeviceSize calculatedOffset = 0;</div> +<div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>  <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div> +<div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>  uint32_t calculatedFreeCount = 0;</div> +<div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>  <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div> +<div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>  VkDeviceSize calculatedSumFreeSize = 0;</div> +<div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>  <span class="comment">// Expected number of free suballocations that should be registered in</span></div> +<div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>  <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div> +<div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>  <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div> +<div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>  <span class="comment">// True if previous visited suballocation was free.</span></div> +<div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>  <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div> +<div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>  </div> +<div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> +<div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>  suballocItem != m_Suballocations.cend();</div> +<div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>  ++suballocItem)</div> +<div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>  {</div> +<div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>  <span class="keyword">const</span> VmaSuballocation& subAlloc = *suballocItem;</div> +<div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>  </div> +<div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>  <span class="comment">// Actual offset of this suballocation doesn't match expected one.</span></div> +<div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>  VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div> +<div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>  </div> +<div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>  <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div> +<div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>  VMA_VALIDATE(!prevFree || !currFree);</div> +<div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>  </div> +<div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>  VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</div> +<div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>  </div> +<div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>  <span class="keywordflow">if</span>(currFree)</div> +<div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>  {</div> +<div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>  calculatedSumFreeSize += subAlloc.size;</div> +<div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>  ++calculatedFreeCount;</div> +<div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>  <span class="keywordflow">if</span>(subAlloc.size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> +<div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>  {</div> +<div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>  ++freeSuballocationsToRegister;</div> +<div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>  }</div> +<div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>  </div> +<div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>  <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div> +<div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>  VMA_VALIDATE(subAlloc.size >= VMA_DEBUG_MARGIN);</div> <div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>  }</div> -<div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>  }</div> -<div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>  </div> -<div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> -<div class="line"><a name="l09410"></a><span class="lineno"> 9410</span> }</div> +<div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>  {</div> +<div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>  VMA_VALIDATE(subAlloc.hAllocation->GetOffset() == subAlloc.offset);</div> +<div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>  VMA_VALIDATE(subAlloc.hAllocation->GetSize() == subAlloc.size);</div> <div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>  </div> -<div class="line"><a name="l09412"></a><span class="lineno"> 9412</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div> -<div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div> -<div class="line"><a name="l09417"></a><span class="lineno"> 9417</span> {</div> -<div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>  VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div> -<div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>  VMA_ASSERT(request.item != m_Suballocations.end());</div> -<div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>  VmaSuballocation& suballoc = *request.item;</div> -<div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>  <span class="comment">// Given suballocation is a free block.</span></div> -<div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>  VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>  <span class="comment">// Given offset is inside this suballocation.</span></div> -<div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>  VMA_ASSERT(request.offset >= suballoc.offset);</div> -<div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div> -<div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>  VMA_ASSERT(suballoc.size >= paddingBegin + allocSize);</div> -<div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>  <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div> +<div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>  <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div> +<div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>  VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</div> +<div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>  }</div> +<div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>  </div> +<div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>  calculatedOffset += subAlloc.size;</div> +<div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>  prevFree = currFree;</div> +<div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>  }</div> +<div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>  </div> +<div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>  <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn't</span></div> +<div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>  <span class="comment">// match expected one.</span></div> +<div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>  VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</div> +<div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>  </div> +<div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>  VkDeviceSize lastSize = 0;</div> +<div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_FreeSuballocationsBySize.size(); ++i)</div> +<div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>  {</div> +<div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>  VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div> <div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>  </div> -<div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>  <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div> -<div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>  <span class="comment">// it to become used.</span></div> -<div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>  UnregisterFreeSuballocation(request.item);</div> -<div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>  </div> -<div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>  suballoc.offset = request.offset;</div> -<div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>  suballoc.size = allocSize;</div> -<div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>  suballoc.type = type;</div> -<div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>  suballoc.hAllocation = hAllocation;</div> -<div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>  </div> -<div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>  <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div> -<div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>  <span class="keywordflow">if</span>(paddingEnd)</div> -<div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>  {</div> -<div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>  VmaSuballocation paddingSuballoc = {};</div> -<div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>  paddingSuballoc.offset = request.offset + allocSize;</div> -<div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>  paddingSuballoc.size = paddingEnd;</div> -<div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>  paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>  VmaSuballocationList::iterator next = request.item;</div> -<div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>  ++next;</div> -<div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>  <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div> -<div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>  m_Suballocations.insert(next, paddingSuballoc);</div> -<div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>  RegisterFreeSuballocation(paddingEndItem);</div> -<div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>  }</div> -<div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>  </div> -<div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>  <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div> -<div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>  <span class="keywordflow">if</span>(paddingBegin)</div> -<div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>  {</div> -<div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>  VmaSuballocation paddingSuballoc = {};</div> -<div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>  paddingSuballoc.offset = request.offset - paddingBegin;</div> -<div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>  paddingSuballoc.size = paddingBegin;</div> -<div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>  paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>  <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div> -<div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>  m_Suballocations.insert(request.item, paddingSuballoc);</div> -<div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>  RegisterFreeSuballocation(paddingBeginItem);</div> -<div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>  }</div> -<div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>  </div> -<div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>  <span class="comment">// Update totals.</span></div> -<div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>  m_FreeCount = m_FreeCount - 1;</div> -<div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>  <span class="keywordflow">if</span>(paddingBegin > 0)</div> -<div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>  {</div> -<div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>  ++m_FreeCount;</div> -<div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>  }</div> -<div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>  <span class="keywordflow">if</span>(paddingEnd > 0)</div> -<div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>  {</div> -<div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>  ++m_FreeCount;</div> -<div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>  }</div> -<div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>  m_SumFreeSize -= allocSize;</div> -<div class="line"><a name="l09475"></a><span class="lineno"> 9475</span> }</div> -<div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>  </div> -<div class="line"><a name="l09477"></a><span class="lineno"> 9477</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div> -<div class="line"><a name="l09478"></a><span class="lineno"> 9478</span> {</div> -<div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div> -<div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>  suballocItem != m_Suballocations.end();</div> +<div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>  <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div> +<div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>  VMA_VALIDATE(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>  <span class="comment">// They must be sorted by size ascending.</span></div> +<div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>  VMA_VALIDATE(suballocItem->size >= lastSize);</div> +<div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>  </div> +<div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>  lastSize = suballocItem->size;</div> +<div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>  }</div> +<div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>  </div> +<div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>  <span class="comment">// Check if totals match calculated values.</span></div> +<div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>  VMA_VALIDATE(ValidateFreeSuballocationList());</div> +<div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>  VMA_VALIDATE(calculatedOffset == GetSize());</div> +<div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>  VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div> +<div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>  VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div> +<div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>  </div> +<div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09444"></a><span class="lineno"> 9444</span> }</div> +<div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>  </div> +<div class="line"><a name="l09446"></a><span class="lineno"> 9446</span> VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> +<div class="line"><a name="l09447"></a><span class="lineno"> 9447</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>  <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div> +<div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>  {</div> +<div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>  <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()->size;</div> +<div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>  }</div> +<div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>  {</div> +<div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>  }</div> +<div class="line"><a name="l09456"></a><span class="lineno"> 9456</span> }</div> +<div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>  </div> +<div class="line"><a name="l09458"></a><span class="lineno"> 9458</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div> +<div class="line"><a name="l09459"></a><span class="lineno"> 9459</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>  <span class="keywordflow">return</span> (m_Suballocations.size() == 1) && (m_FreeCount == 1);</div> +<div class="line"><a name="l09461"></a><span class="lineno"> 9461</span> }</div> +<div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>  </div> +<div class="line"><a name="l09463"></a><span class="lineno"> 9463</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> +<div class="line"><a name="l09464"></a><span class="lineno"> 9464</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> +<div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>  </div> +<div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>  <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div> +<div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div> +<div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div> +<div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>  </div> +<div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div> +<div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> +<div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>  </div> +<div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div> +<div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> +<div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>  </div> +<div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> +<div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>  suballocItem != m_Suballocations.cend();</div> <div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>  ++suballocItem)</div> <div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>  {</div> -<div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>  VmaSuballocation& suballoc = *suballocItem;</div> -<div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>  <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div> +<div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = *suballocItem;</div> +<div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> <div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>  {</div> -<div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>  FreeSuballocation(suballocItem);</div> -<div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>  VMA_HEAVY_ASSERT(Validate());</div> -<div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>  }</div> -<div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>  }</div> -<div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found!"</span>);</div> -<div class="line"><a name="l09492"></a><span class="lineno"> 9492</span> }</div> -<div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>  </div> -<div class="line"><a name="l09494"></a><span class="lineno"> 9494</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</div> -<div class="line"><a name="l09495"></a><span class="lineno"> 9495</span> {</div> -<div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div> -<div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>  suballocItem != m_Suballocations.end();</div> -<div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>  ++suballocItem)</div> -<div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>  {</div> -<div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>  VmaSuballocation& suballoc = *suballocItem;</div> -<div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>  <span class="keywordflow">if</span>(suballoc.offset == offset)</div> -<div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>  {</div> -<div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>  FreeSuballocation(suballocItem);</div> -<div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>  }</div> -<div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>  }</div> -<div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found!"</span>);</div> -<div class="line"><a name="l09508"></a><span class="lineno"> 9508</span> }</div> +<div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> +<div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> +<div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>  }</div> +<div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>  {</div> +<div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div> +<div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div> +<div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>  }</div> +<div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>  }</div> +<div class="line"><a name="l09495"></a><span class="lineno"> 9495</span> }</div> +<div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>  </div> +<div class="line"><a name="l09497"></a><span class="lineno"> 9497</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> +<div class="line"><a name="l09498"></a><span class="lineno"> 9498</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>  <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div> +<div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>  </div> +<div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div> +<div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div> +<div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div> +<div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div> +<div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div> +<div class="line"><a name="l09506"></a><span class="lineno"> 9506</span> }</div> +<div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>  </div> +<div class="line"><a name="l09508"></a><span class="lineno"> 9508</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> <div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>  </div> -<div class="line"><a name="l09510"></a><span class="lineno"> 9510</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div> +<div class="line"><a name="l09510"></a><span class="lineno"> 9510</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> <div class="line"><a name="l09511"></a><span class="lineno"> 9511</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>  VkDeviceSize lastSize = 0;</div> -<div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i < count; ++i)</div> -<div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>  {</div> -<div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>  <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div> +<div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>  PrintDetailedMap_Begin(json,</div> +<div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>  m_SumFreeSize, <span class="comment">// unusedBytes</span></div> +<div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>  m_Suballocations.size() - (<span class="keywordtype">size_t</span>)m_FreeCount, <span class="comment">// allocationCount</span></div> +<div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>  m_FreeCount); <span class="comment">// unusedRangeCount</span></div> <div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>  </div> -<div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>  VMA_VALIDATE(it->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>  VMA_VALIDATE(it->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div> -<div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>  VMA_VALIDATE(it->size >= lastSize);</div> -<div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>  lastSize = it->size;</div> -<div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>  }</div> -<div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09523"></a><span class="lineno"> 9523</span> }</div> -<div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>  </div> -<div class="line"><a name="l09525"></a><span class="lineno"> 9525</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div> -<div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>  VmaSuballocationList::const_iterator suballocItem,</div> -<div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>  VkDeviceSize* pOffset,</div> -<div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>  <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div> -<div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>  VkDeviceSize* pSumFreeSize,</div> -<div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>  VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l09538"></a><span class="lineno"> 9538</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>  VMA_ASSERT(allocSize > 0);</div> -<div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>  VMA_ASSERT(suballocItem != m_Suballocations.cend());</div> -<div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>  VMA_ASSERT(pOffset != VMA_NULL);</div> -<div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>  </div> -<div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>  *itemsToMakeLostCount = 0;</div> -<div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>  *pSumFreeSize = 0;</div> -<div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>  *pSumItemSize = 0;</div> -<div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>  </div> -<div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> -<div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>  {</div> -<div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>  <span class="keywordflow">if</span>(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>  {</div> -<div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>  *pSumFreeSize = suballocItem->size;</div> -<div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>  }</div> -<div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>  {</div> -<div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>  <span class="keywordflow">if</span>(suballocItem->hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>  suballocItem->hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> -<div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>  {</div> -<div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>  ++*itemsToMakeLostCount;</div> -<div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>  *pSumItemSize = suballocItem->size;</div> -<div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>  }</div> -<div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>  {</div> -<div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>  }</div> -<div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>  }</div> -<div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>  </div> -<div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>  <span class="comment">// Remaining size is too small for this request: Early return.</span></div> -<div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>  <span class="keywordflow">if</span>(GetSize() - suballocItem->offset < allocSize)</div> -<div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>  {</div> -<div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>  }</div> -<div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>  </div> -<div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>  <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div> -<div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>  *pOffset = suballocItem->offset;</div> -<div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>  </div> -<div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> -<div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> -<div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>  {</div> -<div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>  *pOffset += VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>  }</div> -<div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>  </div> -<div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>  <span class="comment">// Apply alignment.</span></div> -<div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>  *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div> -<div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>  </div> -<div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> -<div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>  {</div> -<div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>  VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div> -<div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>  <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div> -<div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>  {</div> -<div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>  --prevSuballocItem;</div> -<div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = *prevSuballocItem;</div> -<div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div> -<div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>  {</div> -<div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> -<div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>  {</div> -<div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>  }</div> -<div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>  }</div> -<div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>  }</div> -<div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> -<div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>  {</div> -<div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>  *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div> -<div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>  }</div> -<div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>  }</div> -<div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>  </div> -<div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>  <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div> -<div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>  <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div> -<div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>  <span class="keywordflow">if</span>(*pOffset >= suballocItem->offset + suballocItem->size)</div> -<div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>  {</div> -<div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>  }</div> -<div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>  </div> -<div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>  <span class="comment">// Calculate padding at the beginning based on current offset.</span></div> -<div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem->offset;</div> -<div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>  </div> -<div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>  <span class="comment">// Calculate required margin at the end.</span></div> -<div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>  <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>  </div> -<div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>  <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div> -<div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>  <span class="comment">// Another early return check.</span></div> -<div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>  <span class="keywordflow">if</span>(suballocItem->offset + totalSize > GetSize())</div> -<div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>  {</div> -<div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>  }</div> -<div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>  </div> -<div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>  <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div> -<div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>  <span class="comment">// Update itemsToMakeLostCount.</span></div> -<div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>  VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div> -<div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>  <span class="keywordflow">if</span>(totalSize > suballocItem->size)</div> -<div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>  {</div> -<div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>  VkDeviceSize remainingSize = totalSize - suballocItem->size;</div> -<div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>  <span class="keywordflow">while</span>(remainingSize > 0)</div> -<div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>  {</div> -<div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>  ++lastSuballocItem;</div> -<div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>  <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div> -<div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>  {</div> -<div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>  }</div> -<div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>  <span class="keywordflow">if</span>(lastSuballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>  {</div> -<div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>  *pSumFreeSize += lastSuballocItem->size;</div> -<div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>  }</div> -<div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>  {</div> -<div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>  VMA_ASSERT(lastSuballocItem->hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>  <span class="keywordflow">if</span>(lastSuballocItem->hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>  lastSuballocItem->hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> -<div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>  {</div> -<div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>  ++*itemsToMakeLostCount;</div> -<div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>  *pSumItemSize += lastSuballocItem->size;</div> -<div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>  }</div> -<div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>  {</div> -<div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>  }</div> -<div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>  }</div> -<div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>  remainingSize = (lastSuballocItem->size < remainingSize) ?</div> -<div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>  remainingSize - lastSuballocItem->size : 0;</div> -<div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>  }</div> -<div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>  }</div> -<div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>  </div> -<div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>  <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div> -<div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>  {</div> -<div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>  VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div> -<div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>  ++nextSuballocItem;</div> -<div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>  <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div> -<div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>  {</div> -<div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = *nextSuballocItem;</div> -<div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>  {</div> -<div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> -<div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>  {</div> -<div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>  VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>  <span class="keywordflow">if</span>(nextSuballoc.hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>  nextSuballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> -<div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>  {</div> -<div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>  ++*itemsToMakeLostCount;</div> -<div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>  }</div> -<div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>  {</div> -<div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>  }</div> -<div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>  }</div> -<div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>  }</div> -<div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>  {</div> -<div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>  <span class="comment">// Already on next page.</span></div> -<div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>  }</div> -<div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>  ++nextSuballocItem;</div> -<div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>  }</div> -<div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>  }</div> -<div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>  }</div> -<div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>  {</div> -<div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = *suballocItem;</div> -<div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>  VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>  </div> -<div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>  *pSumFreeSize = suballoc.size;</div> -<div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>  </div> -<div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>  <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div> -<div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>  <span class="keywordflow">if</span>(suballoc.size < allocSize)</div> -<div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>  {</div> -<div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>  }</div> -<div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>  </div> -<div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>  <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div> -<div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>  *pOffset = suballoc.offset;</div> -<div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>  </div> -<div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> -<div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> -<div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>  {</div> -<div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>  *pOffset += VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>  }</div> -<div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>  </div> -<div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>  <span class="comment">// Apply alignment.</span></div> -<div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>  *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div> -<div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>  </div> -<div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> -<div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>  {</div> -<div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>  VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div> -<div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>  <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div> -<div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>  {</div> -<div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>  --prevSuballocItem;</div> -<div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = *prevSuballocItem;</div> -<div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div> -<div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>  {</div> -<div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> -<div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>  {</div> -<div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>  }</div> -<div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>  }</div> -<div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>  }</div> -<div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> -<div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>  {</div> -<div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>  *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div> -<div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>  }</div> -<div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>  }</div> -<div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>  </div> -<div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>  <span class="comment">// Calculate padding at the beginning based on current offset.</span></div> -<div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div> -<div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>  </div> -<div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>  <span class="comment">// Calculate required margin at the end.</span></div> -<div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>  <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>  </div> -<div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>  <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div> -<div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>  <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin > suballoc.size)</div> -<div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>  {</div> -<div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>  }</div> -<div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>  </div> -<div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> -<div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>  {</div> -<div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>  VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div> -<div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>  ++nextSuballocItem;</div> -<div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>  <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div> -<div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>  {</div> -<div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = *nextSuballocItem;</div> -<div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>  {</div> -<div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> -<div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>  {</div> -<div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>  }</div> -<div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>  }</div> -<div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>  {</div> -<div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>  <span class="comment">// Already on next page.</span></div> -<div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>  }</div> -<div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>  ++nextSuballocItem;</div> -<div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>  }</div> -<div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>  }</div> -<div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>  }</div> -<div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>  </div> -<div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>  <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div> -<div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l09797"></a><span class="lineno"> 9797</span> }</div> -<div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>  </div> -<div class="line"><a name="l09799"></a><span class="lineno"> 9799</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div> -<div class="line"><a name="l09800"></a><span class="lineno"> 9800</span> {</div> -<div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>  VMA_ASSERT(item != m_Suballocations.end());</div> -<div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>  </div> -<div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>  VmaSuballocationList::iterator nextItem = item;</div> -<div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>  ++nextItem;</div> -<div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>  VMA_ASSERT(nextItem != m_Suballocations.end());</div> -<div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>  VMA_ASSERT(nextItem->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>  </div> -<div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>  item->size += nextItem->size;</div> -<div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>  --m_FreeCount;</div> -<div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>  m_Suballocations.erase(nextItem);</div> -<div class="line"><a name="l09812"></a><span class="lineno"> 9812</span> }</div> -<div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>  </div> -<div class="line"><a name="l09814"></a><span class="lineno"> 9814</span> VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div> -<div class="line"><a name="l09815"></a><span class="lineno"> 9815</span> {</div> -<div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>  <span class="comment">// Change this suballocation to be marked as free.</span></div> -<div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>  VmaSuballocation& suballoc = *suballocItem;</div> -<div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>  </div> -<div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>  <span class="comment">// Update totals.</span></div> -<div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>  ++m_FreeCount;</div> -<div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>  m_SumFreeSize += suballoc.size;</div> -<div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>  </div> -<div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>  <span class="comment">// Merge with previous and/or next suballocation if it's also free.</span></div> -<div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>  <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>  <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>  </div> -<div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>  VmaSuballocationList::iterator nextItem = suballocItem;</div> -<div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>  ++nextItem;</div> -<div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>  <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) && (nextItem->type == VMA_SUBALLOCATION_TYPE_FREE))</div> -<div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>  {</div> -<div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>  mergeWithNext = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>  }</div> -<div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>  </div> -<div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>  VmaSuballocationList::iterator prevItem = suballocItem;</div> -<div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>  <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div> -<div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>  {</div> -<div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>  --prevItem;</div> -<div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>  <span class="keywordflow">if</span>(prevItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>  {</div> -<div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>  mergeWithPrev = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>  }</div> -<div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>  }</div> -<div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>  </div> -<div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>  <span class="keywordflow">if</span>(mergeWithNext)</div> -<div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>  {</div> -<div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>  UnregisterFreeSuballocation(nextItem);</div> -<div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>  MergeFreeWithNext(suballocItem);</div> -<div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>  }</div> -<div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>  </div> -<div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>  <span class="keywordflow">if</span>(mergeWithPrev)</div> -<div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>  {</div> -<div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>  UnregisterFreeSuballocation(prevItem);</div> -<div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>  MergeFreeWithNext(prevItem);</div> -<div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>  RegisterFreeSuballocation(prevItem);</div> -<div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>  <span class="keywordflow">return</span> prevItem;</div> -<div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>  }</div> -<div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>  {</div> -<div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>  RegisterFreeSuballocation(suballocItem);</div> -<div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>  <span class="keywordflow">return</span> suballocItem;</div> -<div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>  }</div> -<div class="line"><a name="l09864"></a><span class="lineno"> 9864</span> }</div> -<div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>  </div> -<div class="line"><a name="l09866"></a><span class="lineno"> 9866</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div> -<div class="line"><a name="l09867"></a><span class="lineno"> 9867</span> {</div> -<div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>  VMA_ASSERT(item->size > 0);</div> -<div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>  </div> -<div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>  <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div> -<div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>  <span class="comment">// this function, depending on what do you want to check.</span></div> -<div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>  VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div> -<div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>  </div> -<div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>  <span class="keywordflow">if</span>(item->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> -<div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>  {</div> -<div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>  <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div> -<div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>  {</div> -<div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>  m_FreeSuballocationsBySize.push_back(item);</div> -<div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>  }</div> -<div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>  {</div> -<div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>  VmaVectorInsertSorted<VmaSuballocationItemSizeLess>(m_FreeSuballocationsBySize, item);</div> -<div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>  }</div> -<div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>  }</div> -<div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>  </div> -<div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>  <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div> -<div class="line"><a name="l09888"></a><span class="lineno"> 9888</span> }</div> -<div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>  </div> -<div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>  </div> -<div class="line"><a name="l09891"></a><span class="lineno"> 9891</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div> -<div class="line"><a name="l09892"></a><span class="lineno"> 9892</span> {</div> -<div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>  VMA_ASSERT(item->size > 0);</div> -<div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>  </div> -<div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>  <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div> -<div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>  <span class="comment">// this function, depending on what do you want to check.</span></div> -<div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>  VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div> -<div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>  </div> -<div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>  <span class="keywordflow">if</span>(item->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> -<div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>  {</div> -<div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>  VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div> -<div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>  m_FreeSuballocationsBySize.data(),</div> -<div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>  m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div> -<div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>  item,</div> -<div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>  VmaSuballocationItemSizeLess());</div> -<div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div> -<div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>  index < m_FreeSuballocationsBySize.size();</div> -<div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>  ++index)</div> -<div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>  {</div> -<div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>  <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div> -<div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>  {</div> -<div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>  VmaVectorRemove(m_FreeSuballocationsBySize, index);</div> -<div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>  }</div> -<div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>  VMA_ASSERT((m_FreeSuballocationsBySize[index]->size == item->size) && <span class="stringliteral">"Not found."</span>);</div> -<div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>  }</div> -<div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found."</span>);</div> -<div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>  }</div> -<div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>  </div> -<div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>  <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div> -<div class="line"><a name="l09922"></a><span class="lineno"> 9922</span> }</div> -<div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>  </div> -<div class="line"><a name="l09924"></a><span class="lineno"> 9924</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div> -<div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>  VmaSuballocationType& inOutPrevSuballocType)<span class="keyword"> const</span></div> -<div class="line"><a name="l09927"></a><span class="lineno"> 9927</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>  <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</div> -<div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>  {</div> -<div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>  }</div> -<div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>  </div> -<div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>  VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div> -<div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>  <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div> -<div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div> -<div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>  it != m_Suballocations.cend();</div> -<div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>  ++it)</div> -<div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>  {</div> -<div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>  <span class="keyword">const</span> VmaSuballocationType suballocType = it->type;</div> -<div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>  <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>  {</div> -<div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>  minAlignment = VMA_MIN(minAlignment, it->hAllocation->GetAlignment());</div> -<div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</div> -<div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>  {</div> -<div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>  typeConflictFound = <span class="keyword">true</span>;</div> -<div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>  }</div> -<div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>  inOutPrevSuballocType = suballocType;</div> -<div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>  }</div> -<div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>  }</div> -<div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>  </div> -<div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>  <span class="keywordflow">return</span> typeConflictFound || minAlignment >= bufferImageGranularity;</div> -<div class="line"><a name="l09952"></a><span class="lineno"> 9952</span> }</div> -<div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>  </div> -<div class="line"><a name="l09955"></a><span class="lineno"> 9955</span> <span class="comment">// class VmaBlockMetadata_Linear</span></div> -<div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>  </div> -<div class="line"><a name="l09957"></a><span class="lineno"> 9957</span> VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> -<div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>  VmaBlockMetadata(hAllocator),</div> -<div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>  m_SumFreeSize(0),</div> -<div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>  m_Suballocations0(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> -<div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>  m_Suballocations1(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> -<div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>  m_1stVectorIndex(0),</div> -<div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>  m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div> -<div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>  m_1stNullItemsBeginCount(0),</div> -<div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>  m_1stNullItemsMiddleCount(0),</div> -<div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>  m_2ndNullItemsCount(0)</div> -<div class="line"><a name="l09967"></a><span class="lineno"> 9967</span> {</div> -<div class="line"><a name="l09968"></a><span class="lineno"> 9968</span> }</div> -<div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>  </div> -<div class="line"><a name="l09970"></a><span class="lineno"> 9970</span> VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</div> -<div class="line"><a name="l09971"></a><span class="lineno"> 9971</span> {</div> -<div class="line"><a name="l09972"></a><span class="lineno"> 9972</span> }</div> -<div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>  </div> -<div class="line"><a name="l09974"></a><span class="lineno"> 9974</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</div> -<div class="line"><a name="l09975"></a><span class="lineno"> 9975</span> {</div> -<div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>  VmaBlockMetadata::Init(size);</div> -<div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>  m_SumFreeSize = size;</div> -<div class="line"><a name="l09978"></a><span class="lineno"> 9978</span> }</div> -<div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>  </div> -<div class="line"><a name="l09980"></a><span class="lineno"> 9980</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div> -<div class="line"><a name="l09981"></a><span class="lineno"> 9981</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>  </div> -<div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>  VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div> -<div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>  VMA_VALIDATE(!suballocations1st.empty() ||</div> -<div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>  suballocations2nd.empty() ||</div> -<div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>  m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div> +<div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>  <span class="keywordtype">size_t</span> i = 0;</div> +<div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div> +<div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>  suballocItem != m_Suballocations.cend();</div> +<div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>  ++suballocItem, ++i)</div> +<div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>  {</div> +<div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>  <span class="keywordflow">if</span>(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>  {</div> +<div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>  PrintDetailedMap_UnusedRange(json, suballocItem->offset, suballocItem->size);</div> +<div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>  }</div> +<div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>  {</div> +<div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>  PrintDetailedMap_Allocation(json, suballocItem->offset, suballocItem->hAllocation);</div> +<div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>  }</div> +<div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>  }</div> +<div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>  </div> +<div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>  PrintDetailedMap_End(json);</div> +<div class="line"><a name="l09533"></a><span class="lineno"> 9533</span> }</div> +<div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>  </div> +<div class="line"><a name="l09535"></a><span class="lineno"> 9535</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>  </div> +<div class="line"><a name="l09537"></a><span class="lineno"> 9537</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div> +<div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>  uint32_t strategy,</div> +<div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l09548"></a><span class="lineno"> 9548</span> {</div> +<div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>  VMA_ASSERT(allocSize > 0);</div> +<div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>  VMA_ASSERT(!upperAddress);</div> +<div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>  VMA_ASSERT(pAllocationRequest != VMA_NULL);</div> +<div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>  VMA_HEAVY_ASSERT(Validate());</div> +<div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>  </div> +<div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>  pAllocationRequest->type = VmaAllocationRequestType::Normal;</div> +<div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>  </div> +<div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>  <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div> +<div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>  <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &&</div> +<div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>  m_SumFreeSize < allocSize + 2 * VMA_DEBUG_MARGIN)</div> +<div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>  {</div> +<div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>  }</div> +<div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>  </div> +<div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>  <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div> +<div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div> +<div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>  <span class="keywordflow">if</span>(freeSuballocCount > 0)</div> +<div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>  {</div> +<div class="line"><a name="l09568"></a><span class="lineno"> 9568</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="l09569"></a><span class="lineno"> 9569</span>  {</div> +<div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>  <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div> +<div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>  VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>  m_FreeSuballocationsBySize.data(),</div> +<div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>  m_FreeSuballocationsBySize.data() + freeSuballocCount,</div> +<div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>  allocSize + 2 * VMA_DEBUG_MARGIN,</div> +<div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>  VmaSuballocationItemSizeLess());</div> +<div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>  <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div> +<div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>  <span class="keywordflow">for</span>(; index < freeSuballocCount; ++index)</div> +<div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>  {</div> +<div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> +<div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>  currentFrameIndex,</div> +<div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>  frameInUseCount,</div> +<div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>  bufferImageGranularity,</div> +<div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>  allocSize,</div> +<div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>  allocAlignment,</div> +<div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>  allocType,</div> +<div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>  m_FreeSuballocationsBySize[index],</div> +<div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> +<div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>  &pAllocationRequest->offset,</div> +<div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>  &pAllocationRequest->itemsToMakeLostCount,</div> +<div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>  &pAllocationRequest->sumFreeSize,</div> +<div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>  &pAllocationRequest->sumItemSize))</div> +<div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>  {</div> +<div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>  pAllocationRequest->item = m_FreeSuballocationsBySize[index];</div> +<div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>  }</div> +<div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>  }</div> +<div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>  }</div> +<div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(strategy == VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET)</div> +<div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>  {</div> +<div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> +<div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>  it != m_Suballocations.end();</div> +<div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>  ++it)</div> +<div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>  {</div> +<div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>  <span class="keywordflow">if</span>(it->type == VMA_SUBALLOCATION_TYPE_FREE && CheckAllocation(</div> +<div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>  currentFrameIndex,</div> +<div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>  frameInUseCount,</div> +<div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>  bufferImageGranularity,</div> +<div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>  allocSize,</div> +<div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>  allocAlignment,</div> +<div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>  allocType,</div> +<div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>  it,</div> +<div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> +<div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>  &pAllocationRequest->offset,</div> +<div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>  &pAllocationRequest->itemsToMakeLostCount,</div> +<div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>  &pAllocationRequest->sumFreeSize,</div> +<div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>  &pAllocationRequest->sumItemSize))</div> +<div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>  {</div> +<div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>  pAllocationRequest->item = it;</div> +<div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>  }</div> +<div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>  }</div> +<div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>  }</div> +<div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div> +<div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>  {</div> +<div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>  <span class="comment">// Search staring from biggest suballocations.</span></div> +<div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div> +<div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>  {</div> +<div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> +<div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>  currentFrameIndex,</div> +<div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>  frameInUseCount,</div> +<div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>  bufferImageGranularity,</div> +<div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>  allocSize,</div> +<div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>  allocAlignment,</div> +<div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>  allocType,</div> +<div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>  m_FreeSuballocationsBySize[index],</div> +<div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>  <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div> +<div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>  &pAllocationRequest->offset,</div> +<div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>  &pAllocationRequest->itemsToMakeLostCount,</div> +<div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>  &pAllocationRequest->sumFreeSize,</div> +<div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>  &pAllocationRequest->sumItemSize))</div> +<div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>  {</div> +<div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>  pAllocationRequest->item = m_FreeSuballocationsBySize[index];</div> +<div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>  }</div> +<div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>  }</div> +<div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>  }</div> +<div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>  }</div> +<div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>  </div> +<div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> +<div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>  {</div> +<div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>  <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div> +<div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>  </div> +<div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>  <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div> +<div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>  VmaAllocationRequest tmpAllocRequest = {};</div> +<div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>  tmpAllocRequest.type = VmaAllocationRequestType::Normal;</div> +<div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div> +<div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>  suballocIt != m_Suballocations.end();</div> +<div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>  ++suballocIt)</div> +<div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>  {</div> +<div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>  <span class="keywordflow">if</span>(suballocIt->type == VMA_SUBALLOCATION_TYPE_FREE ||</div> +<div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>  suballocIt->hAllocation->CanBecomeLost())</div> +<div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>  {</div> +<div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>  <span class="keywordflow">if</span>(CheckAllocation(</div> +<div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>  currentFrameIndex,</div> +<div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>  frameInUseCount,</div> +<div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>  bufferImageGranularity,</div> +<div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>  allocSize,</div> +<div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>  allocAlignment,</div> +<div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>  allocType,</div> +<div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>  suballocIt,</div> +<div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>  canMakeOtherLost,</div> +<div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>  &tmpAllocRequest.offset,</div> +<div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>  &tmpAllocRequest.itemsToMakeLostCount,</div> +<div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>  &tmpAllocRequest.sumFreeSize,</div> +<div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>  &tmpAllocRequest.sumItemSize))</div> +<div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>  {</div> +<div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>  <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div> +<div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>  {</div> +<div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>  *pAllocationRequest = tmpAllocRequest;</div> +<div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>  pAllocationRequest->item = suballocIt;</div> +<div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>  }</div> +<div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>  <span class="keywordflow">if</span>(!found || tmpAllocRequest.CalcCost() < pAllocationRequest->CalcCost())</div> +<div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>  {</div> +<div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>  *pAllocationRequest = tmpAllocRequest;</div> +<div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>  pAllocationRequest->item = suballocIt;</div> +<div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>  found = <span class="keyword">true</span>;</div> +<div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>  }</div> +<div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>  }</div> +<div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>  }</div> +<div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>  }</div> +<div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>  </div> +<div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>  <span class="keywordflow">return</span> found;</div> +<div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>  }</div> +<div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>  </div> +<div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09697"></a><span class="lineno"> 9697</span> }</div> +<div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>  </div> +<div class="line"><a name="l09699"></a><span class="lineno"> 9699</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l09703"></a><span class="lineno"> 9703</span> {</div> +<div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>  VMA_ASSERT(pAllocationRequest && pAllocationRequest->type == VmaAllocationRequestType::Normal);</div> +<div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>  </div> +<div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>  <span class="keywordflow">while</span>(pAllocationRequest->itemsToMakeLostCount > 0)</div> +<div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>  {</div> +<div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>  <span class="keywordflow">if</span>(pAllocationRequest->item->type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>  {</div> +<div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>  ++pAllocationRequest->item;</div> +<div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>  }</div> +<div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>  VMA_ASSERT(pAllocationRequest->item != m_Suballocations.end());</div> +<div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>  VMA_ASSERT(pAllocationRequest->item->hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>  VMA_ASSERT(pAllocationRequest->item->hAllocation->CanBecomeLost());</div> +<div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>  <span class="keywordflow">if</span>(pAllocationRequest->item->hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> +<div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>  {</div> +<div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>  pAllocationRequest->item = FreeSuballocation(pAllocationRequest->item);</div> +<div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>  --pAllocationRequest->itemsToMakeLostCount;</div> +<div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>  }</div> +<div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>  {</div> +<div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>  }</div> +<div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>  }</div> +<div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>  </div> +<div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>  VMA_HEAVY_ASSERT(Validate());</div> +<div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>  VMA_ASSERT(pAllocationRequest->item != m_Suballocations.end());</div> +<div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>  VMA_ASSERT(pAllocationRequest->item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>  </div> +<div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09731"></a><span class="lineno"> 9731</span> }</div> +<div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>  </div> +<div class="line"><a name="l09733"></a><span class="lineno"> 9733</span> uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> +<div class="line"><a name="l09734"></a><span class="lineno"> 9734</span> {</div> +<div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>  uint32_t lostAllocationCount = 0;</div> +<div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> +<div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>  it != m_Suballocations.end();</div> +<div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>  ++it)</div> +<div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>  {</div> +<div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE &&</div> +<div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>  it->hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>  it->hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> +<div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>  {</div> +<div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>  it = FreeSuballocation(it);</div> +<div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>  ++lostAllocationCount;</div> +<div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>  }</div> +<div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>  }</div> +<div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>  <span class="keywordflow">return</span> lostAllocationCount;</div> +<div class="line"><a name="l09749"></a><span class="lineno"> 9749</span> }</div> +<div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>  </div> +<div class="line"><a name="l09751"></a><span class="lineno"> 9751</span> VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div> +<div class="line"><a name="l09752"></a><span class="lineno"> 9752</span> {</div> +<div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div> +<div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>  it != m_Suballocations.end();</div> +<div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>  ++it)</div> +<div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>  {</div> +<div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>  <span class="keywordflow">if</span>(it->type != VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>  {</div> +<div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it->offset - VMA_DEBUG_MARGIN))</div> +<div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>  {</div> +<div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>  }</div> +<div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it->offset + it->size))</div> +<div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>  {</div> +<div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>  }</div> +<div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>  }</div> +<div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>  }</div> +<div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>  </div> +<div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> +<div class="line"><a name="l09773"></a><span class="lineno"> 9773</span> }</div> +<div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>  </div> +<div class="line"><a name="l09775"></a><span class="lineno"> 9775</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div> +<div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div> +<div class="line"><a name="l09780"></a><span class="lineno"> 9780</span> {</div> +<div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>  VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div> +<div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>  VMA_ASSERT(request.item != m_Suballocations.end());</div> +<div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>  VmaSuballocation& suballoc = *request.item;</div> +<div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>  <span class="comment">// Given suballocation is a free block.</span></div> +<div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>  VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>  <span class="comment">// Given offset is inside this suballocation.</span></div> +<div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>  VMA_ASSERT(request.offset >= suballoc.offset);</div> +<div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div> +<div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>  VMA_ASSERT(suballoc.size >= paddingBegin + allocSize);</div> +<div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>  <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div> +<div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>  </div> +<div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>  <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div> +<div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>  <span class="comment">// it to become used.</span></div> +<div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>  UnregisterFreeSuballocation(request.item);</div> +<div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>  </div> +<div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>  suballoc.offset = request.offset;</div> +<div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>  suballoc.size = allocSize;</div> +<div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>  suballoc.type = type;</div> +<div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>  suballoc.hAllocation = hAllocation;</div> +<div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>  </div> +<div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>  <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div> +<div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>  <span class="keywordflow">if</span>(paddingEnd)</div> +<div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>  {</div> +<div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>  VmaSuballocation paddingSuballoc = {};</div> +<div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>  paddingSuballoc.offset = request.offset + allocSize;</div> +<div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>  paddingSuballoc.size = paddingEnd;</div> +<div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>  paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>  VmaSuballocationList::iterator next = request.item;</div> +<div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>  ++next;</div> +<div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>  <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div> +<div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>  m_Suballocations.insert(next, paddingSuballoc);</div> +<div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>  RegisterFreeSuballocation(paddingEndItem);</div> +<div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>  }</div> +<div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>  </div> +<div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>  <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div> +<div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>  <span class="keywordflow">if</span>(paddingBegin)</div> +<div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>  {</div> +<div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>  VmaSuballocation paddingSuballoc = {};</div> +<div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>  paddingSuballoc.offset = request.offset - paddingBegin;</div> +<div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>  paddingSuballoc.size = paddingBegin;</div> +<div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>  paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>  <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div> +<div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>  m_Suballocations.insert(request.item, paddingSuballoc);</div> +<div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>  RegisterFreeSuballocation(paddingBeginItem);</div> +<div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>  }</div> +<div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>  </div> +<div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>  <span class="comment">// Update totals.</span></div> +<div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>  m_FreeCount = m_FreeCount - 1;</div> +<div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>  <span class="keywordflow">if</span>(paddingBegin > 0)</div> +<div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>  {</div> +<div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>  ++m_FreeCount;</div> +<div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>  }</div> +<div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>  <span class="keywordflow">if</span>(paddingEnd > 0)</div> +<div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>  {</div> +<div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>  ++m_FreeCount;</div> +<div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>  }</div> +<div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>  m_SumFreeSize -= allocSize;</div> +<div class="line"><a name="l09838"></a><span class="lineno"> 9838</span> }</div> +<div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>  </div> +<div class="line"><a name="l09840"></a><span class="lineno"> 9840</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div> +<div class="line"><a name="l09841"></a><span class="lineno"> 9841</span> {</div> +<div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div> +<div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>  suballocItem != m_Suballocations.end();</div> +<div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>  ++suballocItem)</div> +<div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>  {</div> +<div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>  VmaSuballocation& suballoc = *suballocItem;</div> +<div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>  <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div> +<div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>  {</div> +<div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>  FreeSuballocation(suballocItem);</div> +<div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>  VMA_HEAVY_ASSERT(Validate());</div> +<div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>  }</div> +<div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>  }</div> +<div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found!"</span>);</div> +<div class="line"><a name="l09855"></a><span class="lineno"> 9855</span> }</div> +<div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>  </div> +<div class="line"><a name="l09857"></a><span class="lineno"> 9857</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</div> +<div class="line"><a name="l09858"></a><span class="lineno"> 9858</span> {</div> +<div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>  <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div> +<div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>  suballocItem != m_Suballocations.end();</div> +<div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>  ++suballocItem)</div> +<div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>  {</div> +<div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>  VmaSuballocation& suballoc = *suballocItem;</div> +<div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>  <span class="keywordflow">if</span>(suballoc.offset == offset)</div> +<div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>  {</div> +<div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>  FreeSuballocation(suballocItem);</div> +<div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>  }</div> +<div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>  }</div> +<div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found!"</span>);</div> +<div class="line"><a name="l09871"></a><span class="lineno"> 9871</span> }</div> +<div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>  </div> +<div class="line"><a name="l09873"></a><span class="lineno"> 9873</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div> +<div class="line"><a name="l09874"></a><span class="lineno"> 9874</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>  VkDeviceSize lastSize = 0;</div> +<div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i < count; ++i)</div> +<div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>  {</div> +<div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>  <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div> +<div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>  </div> +<div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>  VMA_VALIDATE(it->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>  VMA_VALIDATE(it->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div> +<div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>  VMA_VALIDATE(it->size >= lastSize);</div> +<div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>  lastSize = it->size;</div> +<div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>  }</div> +<div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l09886"></a><span class="lineno"> 9886</span> }</div> +<div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>  </div> +<div class="line"><a name="l09888"></a><span class="lineno"> 9888</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div> +<div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>  VmaSuballocationList::const_iterator suballocItem,</div> +<div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>  VkDeviceSize* pOffset,</div> +<div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>  <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div> +<div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>  VkDeviceSize* pSumFreeSize,</div> +<div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>  VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l09901"></a><span class="lineno"> 9901</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>  VMA_ASSERT(allocSize > 0);</div> +<div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>  VMA_ASSERT(suballocItem != m_Suballocations.cend());</div> +<div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>  VMA_ASSERT(pOffset != VMA_NULL);</div> +<div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>  </div> +<div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>  *itemsToMakeLostCount = 0;</div> +<div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>  *pSumFreeSize = 0;</div> +<div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>  *pSumItemSize = 0;</div> +<div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>  </div> +<div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> +<div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>  {</div> +<div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>  <span class="keywordflow">if</span>(suballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>  {</div> +<div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>  *pSumFreeSize = suballocItem->size;</div> +<div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>  }</div> +<div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>  {</div> +<div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>  <span class="keywordflow">if</span>(suballocItem->hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>  suballocItem->hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> +<div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>  {</div> +<div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>  ++*itemsToMakeLostCount;</div> +<div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>  *pSumItemSize = suballocItem->size;</div> +<div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>  }</div> +<div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>  {</div> +<div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>  }</div> +<div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>  }</div> +<div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>  </div> +<div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>  <span class="comment">// Remaining size is too small for this request: Early return.</span></div> +<div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>  <span class="keywordflow">if</span>(GetSize() - suballocItem->offset < allocSize)</div> +<div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>  {</div> +<div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>  }</div> +<div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>  </div> +<div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>  <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div> +<div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>  *pOffset = suballocItem->offset;</div> +<div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>  </div> +<div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> +<div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> +<div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>  {</div> +<div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>  *pOffset += VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>  }</div> +<div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>  </div> +<div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>  <span class="comment">// Apply alignment.</span></div> +<div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>  *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div> +<div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>  </div> +<div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> +<div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment)</div> +<div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>  {</div> +<div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> +<div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>  VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div> +<div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>  <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div> +<div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>  {</div> +<div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>  --prevSuballocItem;</div> +<div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = *prevSuballocItem;</div> +<div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div> +<div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>  {</div> +<div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> +<div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>  {</div> +<div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> +<div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>  }</div> +<div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>  }</div> +<div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>  }</div> +<div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> +<div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>  {</div> +<div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>  *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div> +<div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>  }</div> +<div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>  }</div> +<div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>  </div> +<div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>  <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div> +<div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>  <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div> +<div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>  <span class="keywordflow">if</span>(*pOffset >= suballocItem->offset + suballocItem->size)</div> +<div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>  {</div> +<div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>  }</div> +<div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>  </div> +<div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>  <span class="comment">// Calculate padding at the beginning based on current offset.</span></div> +<div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem->offset;</div> +<div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>  </div> +<div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>  <span class="comment">// Calculate required margin at the end.</span></div> +<div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>  <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div> <div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>  </div> -<div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> -<div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>  {</div> -<div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>  <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div> -<div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>  VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>  <span class="comment">// Null item at the end should be just pop_back().</span></div> -<div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>  VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>  }</div> -<div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> -<div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>  {</div> -<div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>  <span class="comment">// Null item at the end should be just pop_back().</span></div> -<div class="line"><a name="l10000"></a><span class="lineno">10000</span>  VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l10001"></a><span class="lineno">10001</span>  }</div> -<div class="line"><a name="l10002"></a><span class="lineno">10002</span>  </div> -<div class="line"><a name="l10003"></a><span class="lineno">10003</span>  VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount <= suballocations1st.size());</div> -<div class="line"><a name="l10004"></a><span class="lineno">10004</span>  VMA_VALIDATE(m_2ndNullItemsCount <= suballocations2nd.size());</div> -<div class="line"><a name="l10005"></a><span class="lineno">10005</span>  </div> -<div class="line"><a name="l10006"></a><span class="lineno">10006</span>  VkDeviceSize sumUsedSize = 0;</div> -<div class="line"><a name="l10007"></a><span class="lineno">10007</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> -<div class="line"><a name="l10008"></a><span class="lineno">10008</span>  VkDeviceSize offset = VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l10009"></a><span class="lineno">10009</span>  </div> -<div class="line"><a name="l10010"></a><span class="lineno">10010</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l10011"></a><span class="lineno">10011</span>  {</div> -<div class="line"><a name="l10012"></a><span class="lineno">10012</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> -<div class="line"><a name="l10013"></a><span class="lineno">10013</span>  <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div> -<div class="line"><a name="l10014"></a><span class="lineno">10014</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < suballoc2ndCount; ++i)</div> -<div class="line"><a name="l10015"></a><span class="lineno">10015</span>  {</div> -<div class="line"><a name="l10016"></a><span class="lineno">10016</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> -<div class="line"><a name="l10017"></a><span class="lineno">10017</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l10018"></a><span class="lineno">10018</span>  </div> -<div class="line"><a name="l10019"></a><span class="lineno">10019</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> -<div class="line"><a name="l10020"></a><span class="lineno">10020</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> -<div class="line"><a name="l10021"></a><span class="lineno">10021</span>  </div> -<div class="line"><a name="l10022"></a><span class="lineno">10022</span>  <span class="keywordflow">if</span>(!currFree)</div> -<div class="line"><a name="l10023"></a><span class="lineno">10023</span>  {</div> -<div class="line"><a name="l10024"></a><span class="lineno">10024</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> -<div class="line"><a name="l10025"></a><span class="lineno">10025</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> -<div class="line"><a name="l10026"></a><span class="lineno">10026</span>  sumUsedSize += suballoc.size;</div> -<div class="line"><a name="l10027"></a><span class="lineno">10027</span>  }</div> -<div class="line"><a name="l10028"></a><span class="lineno">10028</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10029"></a><span class="lineno">10029</span>  {</div> -<div class="line"><a name="l10030"></a><span class="lineno">10030</span>  ++nullItem2ndCount;</div> -<div class="line"><a name="l10031"></a><span class="lineno">10031</span>  }</div> +<div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>  <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div> +<div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>  <span class="comment">// Another early return check.</span></div> +<div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>  <span class="keywordflow">if</span>(suballocItem->offset + totalSize > GetSize())</div> +<div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>  {</div> +<div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>  }</div> +<div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>  </div> +<div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>  <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div> +<div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>  <span class="comment">// Update itemsToMakeLostCount.</span></div> +<div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>  VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div> +<div class="line"><a name="l10000"></a><span class="lineno">10000</span>  <span class="keywordflow">if</span>(totalSize > suballocItem->size)</div> +<div class="line"><a name="l10001"></a><span class="lineno">10001</span>  {</div> +<div class="line"><a name="l10002"></a><span class="lineno">10002</span>  VkDeviceSize remainingSize = totalSize - suballocItem->size;</div> +<div class="line"><a name="l10003"></a><span class="lineno">10003</span>  <span class="keywordflow">while</span>(remainingSize > 0)</div> +<div class="line"><a name="l10004"></a><span class="lineno">10004</span>  {</div> +<div class="line"><a name="l10005"></a><span class="lineno">10005</span>  ++lastSuballocItem;</div> +<div class="line"><a name="l10006"></a><span class="lineno">10006</span>  <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div> +<div class="line"><a name="l10007"></a><span class="lineno">10007</span>  {</div> +<div class="line"><a name="l10008"></a><span class="lineno">10008</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10009"></a><span class="lineno">10009</span>  }</div> +<div class="line"><a name="l10010"></a><span class="lineno">10010</span>  <span class="keywordflow">if</span>(lastSuballocItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l10011"></a><span class="lineno">10011</span>  {</div> +<div class="line"><a name="l10012"></a><span class="lineno">10012</span>  *pSumFreeSize += lastSuballocItem->size;</div> +<div class="line"><a name="l10013"></a><span class="lineno">10013</span>  }</div> +<div class="line"><a name="l10014"></a><span class="lineno">10014</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10015"></a><span class="lineno">10015</span>  {</div> +<div class="line"><a name="l10016"></a><span class="lineno">10016</span>  VMA_ASSERT(lastSuballocItem->hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l10017"></a><span class="lineno">10017</span>  <span class="keywordflow">if</span>(lastSuballocItem->hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l10018"></a><span class="lineno">10018</span>  lastSuballocItem->hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> +<div class="line"><a name="l10019"></a><span class="lineno">10019</span>  {</div> +<div class="line"><a name="l10020"></a><span class="lineno">10020</span>  ++*itemsToMakeLostCount;</div> +<div class="line"><a name="l10021"></a><span class="lineno">10021</span>  *pSumItemSize += lastSuballocItem->size;</div> +<div class="line"><a name="l10022"></a><span class="lineno">10022</span>  }</div> +<div class="line"><a name="l10023"></a><span class="lineno">10023</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10024"></a><span class="lineno">10024</span>  {</div> +<div class="line"><a name="l10025"></a><span class="lineno">10025</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10026"></a><span class="lineno">10026</span>  }</div> +<div class="line"><a name="l10027"></a><span class="lineno">10027</span>  }</div> +<div class="line"><a name="l10028"></a><span class="lineno">10028</span>  remainingSize = (lastSuballocItem->size < remainingSize) ?</div> +<div class="line"><a name="l10029"></a><span class="lineno">10029</span>  remainingSize - lastSuballocItem->size : 0;</div> +<div class="line"><a name="l10030"></a><span class="lineno">10030</span>  }</div> +<div class="line"><a name="l10031"></a><span class="lineno">10031</span>  }</div> <div class="line"><a name="l10032"></a><span class="lineno">10032</span>  </div> -<div class="line"><a name="l10033"></a><span class="lineno">10033</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l10034"></a><span class="lineno">10034</span>  }</div> -<div class="line"><a name="l10035"></a><span class="lineno">10035</span>  </div> -<div class="line"><a name="l10036"></a><span class="lineno">10036</span>  VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div> -<div class="line"><a name="l10037"></a><span class="lineno">10037</span>  }</div> -<div class="line"><a name="l10038"></a><span class="lineno">10038</span>  </div> -<div class="line"><a name="l10039"></a><span class="lineno">10039</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_1stNullItemsBeginCount; ++i)</div> -<div class="line"><a name="l10040"></a><span class="lineno">10040</span>  {</div> -<div class="line"><a name="l10041"></a><span class="lineno">10041</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> -<div class="line"><a name="l10042"></a><span class="lineno">10042</span>  VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &&</div> -<div class="line"><a name="l10043"></a><span class="lineno">10043</span>  suballoc.hAllocation == VK_NULL_HANDLE);</div> -<div class="line"><a name="l10044"></a><span class="lineno">10044</span>  }</div> -<div class="line"><a name="l10045"></a><span class="lineno">10045</span>  </div> -<div class="line"><a name="l10046"></a><span class="lineno">10046</span>  <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10047"></a><span class="lineno">10047</span>  </div> -<div class="line"><a name="l10048"></a><span class="lineno">10048</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i < suballoc1stCount; ++i)</div> -<div class="line"><a name="l10049"></a><span class="lineno">10049</span>  {</div> -<div class="line"><a name="l10050"></a><span class="lineno">10050</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> -<div class="line"><a name="l10051"></a><span class="lineno">10051</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l10052"></a><span class="lineno">10052</span>  </div> -<div class="line"><a name="l10053"></a><span class="lineno">10053</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> -<div class="line"><a name="l10054"></a><span class="lineno">10054</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> -<div class="line"><a name="l10055"></a><span class="lineno">10055</span>  VMA_VALIDATE(i >= m_1stNullItemsBeginCount || currFree);</div> -<div class="line"><a name="l10056"></a><span class="lineno">10056</span>  </div> -<div class="line"><a name="l10057"></a><span class="lineno">10057</span>  <span class="keywordflow">if</span>(!currFree)</div> -<div class="line"><a name="l10058"></a><span class="lineno">10058</span>  {</div> -<div class="line"><a name="l10059"></a><span class="lineno">10059</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> -<div class="line"><a name="l10060"></a><span class="lineno">10060</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> -<div class="line"><a name="l10061"></a><span class="lineno">10061</span>  sumUsedSize += suballoc.size;</div> -<div class="line"><a name="l10062"></a><span class="lineno">10062</span>  }</div> -<div class="line"><a name="l10063"></a><span class="lineno">10063</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10064"></a><span class="lineno">10064</span>  {</div> -<div class="line"><a name="l10065"></a><span class="lineno">10065</span>  ++nullItem1stCount;</div> -<div class="line"><a name="l10066"></a><span class="lineno">10066</span>  }</div> -<div class="line"><a name="l10067"></a><span class="lineno">10067</span>  </div> -<div class="line"><a name="l10068"></a><span class="lineno">10068</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l10069"></a><span class="lineno">10069</span>  }</div> -<div class="line"><a name="l10070"></a><span class="lineno">10070</span>  VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div> +<div class="line"><a name="l10033"></a><span class="lineno">10033</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l10034"></a><span class="lineno">10034</span>  <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div> +<div class="line"><a name="l10035"></a><span class="lineno">10035</span>  <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)</div> +<div class="line"><a name="l10036"></a><span class="lineno">10036</span>  {</div> +<div class="line"><a name="l10037"></a><span class="lineno">10037</span>  VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div> +<div class="line"><a name="l10038"></a><span class="lineno">10038</span>  ++nextSuballocItem;</div> +<div class="line"><a name="l10039"></a><span class="lineno">10039</span>  <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div> +<div class="line"><a name="l10040"></a><span class="lineno">10040</span>  {</div> +<div class="line"><a name="l10041"></a><span class="lineno">10041</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = *nextSuballocItem;</div> +<div class="line"><a name="l10042"></a><span class="lineno">10042</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l10043"></a><span class="lineno">10043</span>  {</div> +<div class="line"><a name="l10044"></a><span class="lineno">10044</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> +<div class="line"><a name="l10045"></a><span class="lineno">10045</span>  {</div> +<div class="line"><a name="l10046"></a><span class="lineno">10046</span>  VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l10047"></a><span class="lineno">10047</span>  <span class="keywordflow">if</span>(nextSuballoc.hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l10048"></a><span class="lineno">10048</span>  nextSuballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> +<div class="line"><a name="l10049"></a><span class="lineno">10049</span>  {</div> +<div class="line"><a name="l10050"></a><span class="lineno">10050</span>  ++*itemsToMakeLostCount;</div> +<div class="line"><a name="l10051"></a><span class="lineno">10051</span>  }</div> +<div class="line"><a name="l10052"></a><span class="lineno">10052</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10053"></a><span class="lineno">10053</span>  {</div> +<div class="line"><a name="l10054"></a><span class="lineno">10054</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10055"></a><span class="lineno">10055</span>  }</div> +<div class="line"><a name="l10056"></a><span class="lineno">10056</span>  }</div> +<div class="line"><a name="l10057"></a><span class="lineno">10057</span>  }</div> +<div class="line"><a name="l10058"></a><span class="lineno">10058</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10059"></a><span class="lineno">10059</span>  {</div> +<div class="line"><a name="l10060"></a><span class="lineno">10060</span>  <span class="comment">// Already on next page.</span></div> +<div class="line"><a name="l10061"></a><span class="lineno">10061</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10062"></a><span class="lineno">10062</span>  }</div> +<div class="line"><a name="l10063"></a><span class="lineno">10063</span>  ++nextSuballocItem;</div> +<div class="line"><a name="l10064"></a><span class="lineno">10064</span>  }</div> +<div class="line"><a name="l10065"></a><span class="lineno">10065</span>  }</div> +<div class="line"><a name="l10066"></a><span class="lineno">10066</span>  }</div> +<div class="line"><a name="l10067"></a><span class="lineno">10067</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10068"></a><span class="lineno">10068</span>  {</div> +<div class="line"><a name="l10069"></a><span class="lineno">10069</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = *suballocItem;</div> +<div class="line"><a name="l10070"></a><span class="lineno">10070</span>  VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> <div class="line"><a name="l10071"></a><span class="lineno">10071</span>  </div> -<div class="line"><a name="l10072"></a><span class="lineno">10072</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l10073"></a><span class="lineno">10073</span>  {</div> -<div class="line"><a name="l10074"></a><span class="lineno">10074</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> -<div class="line"><a name="l10075"></a><span class="lineno">10075</span>  <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div> -<div class="line"><a name="l10076"></a><span class="lineno">10076</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div> -<div class="line"><a name="l10077"></a><span class="lineno">10077</span>  {</div> -<div class="line"><a name="l10078"></a><span class="lineno">10078</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> -<div class="line"><a name="l10079"></a><span class="lineno">10079</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l10080"></a><span class="lineno">10080</span>  </div> -<div class="line"><a name="l10081"></a><span class="lineno">10081</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> -<div class="line"><a name="l10082"></a><span class="lineno">10082</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> -<div class="line"><a name="l10083"></a><span class="lineno">10083</span>  </div> -<div class="line"><a name="l10084"></a><span class="lineno">10084</span>  <span class="keywordflow">if</span>(!currFree)</div> -<div class="line"><a name="l10085"></a><span class="lineno">10085</span>  {</div> -<div class="line"><a name="l10086"></a><span class="lineno">10086</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> -<div class="line"><a name="l10087"></a><span class="lineno">10087</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> -<div class="line"><a name="l10088"></a><span class="lineno">10088</span>  sumUsedSize += suballoc.size;</div> -<div class="line"><a name="l10089"></a><span class="lineno">10089</span>  }</div> -<div class="line"><a name="l10090"></a><span class="lineno">10090</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10091"></a><span class="lineno">10091</span>  {</div> -<div class="line"><a name="l10092"></a><span class="lineno">10092</span>  ++nullItem2ndCount;</div> -<div class="line"><a name="l10093"></a><span class="lineno">10093</span>  }</div> -<div class="line"><a name="l10094"></a><span class="lineno">10094</span>  </div> -<div class="line"><a name="l10095"></a><span class="lineno">10095</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l10096"></a><span class="lineno">10096</span>  }</div> -<div class="line"><a name="l10097"></a><span class="lineno">10097</span>  </div> -<div class="line"><a name="l10098"></a><span class="lineno">10098</span>  VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div> -<div class="line"><a name="l10099"></a><span class="lineno">10099</span>  }</div> -<div class="line"><a name="l10100"></a><span class="lineno">10100</span>  </div> -<div class="line"><a name="l10101"></a><span class="lineno">10101</span>  VMA_VALIDATE(offset <= GetSize());</div> -<div class="line"><a name="l10102"></a><span class="lineno">10102</span>  VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div> -<div class="line"><a name="l10103"></a><span class="lineno">10103</span>  </div> -<div class="line"><a name="l10104"></a><span class="lineno">10104</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l10105"></a><span class="lineno">10105</span> }</div> -<div class="line"><a name="l10106"></a><span class="lineno">10106</span>  </div> -<div class="line"><a name="l10107"></a><span class="lineno">10107</span> <span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div> -<div class="line"><a name="l10108"></a><span class="lineno">10108</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l10109"></a><span class="lineno">10109</span>  <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div> -<div class="line"><a name="l10110"></a><span class="lineno">10110</span>  AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div> -<div class="line"><a name="l10111"></a><span class="lineno">10111</span> }</div> -<div class="line"><a name="l10112"></a><span class="lineno">10112</span>  </div> -<div class="line"><a name="l10113"></a><span class="lineno">10113</span> VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> -<div class="line"><a name="l10114"></a><span class="lineno">10114</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l10115"></a><span class="lineno">10115</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l10116"></a><span class="lineno">10116</span>  </div> -<div class="line"><a name="l10117"></a><span class="lineno">10117</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l10118"></a><span class="lineno">10118</span> <span class="comment"> We don't consider gaps inside allocation vectors with freed allocations because</span></div> -<div class="line"><a name="l10119"></a><span class="lineno">10119</span> <span class="comment"> they are not suitable for reuse in linear allocator. We consider only space that</span></div> -<div class="line"><a name="l10120"></a><span class="lineno">10120</span> <span class="comment"> is available for new allocations.</span></div> -<div class="line"><a name="l10121"></a><span class="lineno">10121</span> <span class="comment"> */</span></div> -<div class="line"><a name="l10122"></a><span class="lineno">10122</span>  <span class="keywordflow">if</span>(IsEmpty())</div> -<div class="line"><a name="l10123"></a><span class="lineno">10123</span>  {</div> -<div class="line"><a name="l10124"></a><span class="lineno">10124</span>  <span class="keywordflow">return</span> size;</div> -<div class="line"><a name="l10125"></a><span class="lineno">10125</span>  }</div> -<div class="line"><a name="l10126"></a><span class="lineno">10126</span>  </div> -<div class="line"><a name="l10127"></a><span class="lineno">10127</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l10128"></a><span class="lineno">10128</span>  </div> -<div class="line"><a name="l10129"></a><span class="lineno">10129</span>  <span class="keywordflow">switch</span>(m_2ndVectorMode)</div> -<div class="line"><a name="l10130"></a><span class="lineno">10130</span>  {</div> -<div class="line"><a name="l10131"></a><span class="lineno">10131</span>  <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div> -<div class="line"><a name="l10132"></a><span class="lineno">10132</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l10133"></a><span class="lineno">10133</span> <span class="comment"> Available space is after end of 1st, as well as before beginning of 1st (which</span></div> -<div class="line"><a name="l10134"></a><span class="lineno">10134</span> <span class="comment"> whould make it a ring buffer).</span></div> -<div class="line"><a name="l10135"></a><span class="lineno">10135</span> <span class="comment"> */</span></div> -<div class="line"><a name="l10136"></a><span class="lineno">10136</span>  {</div> -<div class="line"><a name="l10137"></a><span class="lineno">10137</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div> -<div class="line"><a name="l10138"></a><span class="lineno">10138</span>  VMA_ASSERT(suballocations1stCount > m_1stNullItemsBeginCount);</div> -<div class="line"><a name="l10139"></a><span class="lineno">10139</span>  <span class="keyword">const</span> VmaSuballocation& firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div> -<div class="line"><a name="l10140"></a><span class="lineno">10140</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations1st[suballocations1stCount - 1];</div> -<div class="line"><a name="l10141"></a><span class="lineno">10141</span>  <span class="keywordflow">return</span> VMA_MAX(</div> -<div class="line"><a name="l10142"></a><span class="lineno">10142</span>  firstSuballoc.offset,</div> -<div class="line"><a name="l10143"></a><span class="lineno">10143</span>  size - (lastSuballoc.offset + lastSuballoc.size));</div> -<div class="line"><a name="l10144"></a><span class="lineno">10144</span>  }</div> -<div class="line"><a name="l10145"></a><span class="lineno">10145</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10146"></a><span class="lineno">10146</span>  </div> -<div class="line"><a name="l10147"></a><span class="lineno">10147</span>  <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div> -<div class="line"><a name="l10148"></a><span class="lineno">10148</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l10149"></a><span class="lineno">10149</span> <span class="comment"> Available space is only between end of 2nd and beginning of 1st.</span></div> -<div class="line"><a name="l10150"></a><span class="lineno">10150</span> <span class="comment"> */</span></div> -<div class="line"><a name="l10151"></a><span class="lineno">10151</span>  {</div> -<div class="line"><a name="l10152"></a><span class="lineno">10152</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10153"></a><span class="lineno">10153</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc2nd = suballocations2nd.back();</div> -<div class="line"><a name="l10154"></a><span class="lineno">10154</span>  <span class="keyword">const</span> VmaSuballocation& firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div> -<div class="line"><a name="l10155"></a><span class="lineno">10155</span>  <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div> -<div class="line"><a name="l10156"></a><span class="lineno">10156</span>  }</div> -<div class="line"><a name="l10157"></a><span class="lineno">10157</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10158"></a><span class="lineno">10158</span>  </div> -<div class="line"><a name="l10159"></a><span class="lineno">10159</span>  <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div> -<div class="line"><a name="l10160"></a><span class="lineno">10160</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l10161"></a><span class="lineno">10161</span> <span class="comment"> Available space is only between end of 1st and top of 2nd.</span></div> -<div class="line"><a name="l10162"></a><span class="lineno">10162</span> <span class="comment"> */</span></div> -<div class="line"><a name="l10163"></a><span class="lineno">10163</span>  {</div> -<div class="line"><a name="l10164"></a><span class="lineno">10164</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10165"></a><span class="lineno">10165</span>  <span class="keyword">const</span> VmaSuballocation& topSuballoc2nd = suballocations2nd.back();</div> -<div class="line"><a name="l10166"></a><span class="lineno">10166</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc1st = suballocations1st.back();</div> -<div class="line"><a name="l10167"></a><span class="lineno">10167</span>  <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</div> -<div class="line"><a name="l10168"></a><span class="lineno">10168</span>  }</div> -<div class="line"><a name="l10169"></a><span class="lineno">10169</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10170"></a><span class="lineno">10170</span>  </div> -<div class="line"><a name="l10171"></a><span class="lineno">10171</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l10172"></a><span class="lineno">10172</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l10173"></a><span class="lineno">10173</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l10174"></a><span class="lineno">10174</span>  }</div> +<div class="line"><a name="l10072"></a><span class="lineno">10072</span>  *pSumFreeSize = suballoc.size;</div> +<div class="line"><a name="l10073"></a><span class="lineno">10073</span>  </div> +<div class="line"><a name="l10074"></a><span class="lineno">10074</span>  <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div> +<div class="line"><a name="l10075"></a><span class="lineno">10075</span>  <span class="keywordflow">if</span>(suballoc.size < allocSize)</div> +<div class="line"><a name="l10076"></a><span class="lineno">10076</span>  {</div> +<div class="line"><a name="l10077"></a><span class="lineno">10077</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10078"></a><span class="lineno">10078</span>  }</div> +<div class="line"><a name="l10079"></a><span class="lineno">10079</span>  </div> +<div class="line"><a name="l10080"></a><span class="lineno">10080</span>  <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div> +<div class="line"><a name="l10081"></a><span class="lineno">10081</span>  *pOffset = suballoc.offset;</div> +<div class="line"><a name="l10082"></a><span class="lineno">10082</span>  </div> +<div class="line"><a name="l10083"></a><span class="lineno">10083</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> +<div class="line"><a name="l10084"></a><span class="lineno">10084</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> +<div class="line"><a name="l10085"></a><span class="lineno">10085</span>  {</div> +<div class="line"><a name="l10086"></a><span class="lineno">10086</span>  *pOffset += VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10087"></a><span class="lineno">10087</span>  }</div> +<div class="line"><a name="l10088"></a><span class="lineno">10088</span>  </div> +<div class="line"><a name="l10089"></a><span class="lineno">10089</span>  <span class="comment">// Apply alignment.</span></div> +<div class="line"><a name="l10090"></a><span class="lineno">10090</span>  *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div> +<div class="line"><a name="l10091"></a><span class="lineno">10091</span>  </div> +<div class="line"><a name="l10092"></a><span class="lineno">10092</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l10093"></a><span class="lineno">10093</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> +<div class="line"><a name="l10094"></a><span class="lineno">10094</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment)</div> +<div class="line"><a name="l10095"></a><span class="lineno">10095</span>  {</div> +<div class="line"><a name="l10096"></a><span class="lineno">10096</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> +<div class="line"><a name="l10097"></a><span class="lineno">10097</span>  VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div> +<div class="line"><a name="l10098"></a><span class="lineno">10098</span>  <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div> +<div class="line"><a name="l10099"></a><span class="lineno">10099</span>  {</div> +<div class="line"><a name="l10100"></a><span class="lineno">10100</span>  --prevSuballocItem;</div> +<div class="line"><a name="l10101"></a><span class="lineno">10101</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = *prevSuballocItem;</div> +<div class="line"><a name="l10102"></a><span class="lineno">10102</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div> +<div class="line"><a name="l10103"></a><span class="lineno">10103</span>  {</div> +<div class="line"><a name="l10104"></a><span class="lineno">10104</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> +<div class="line"><a name="l10105"></a><span class="lineno">10105</span>  {</div> +<div class="line"><a name="l10106"></a><span class="lineno">10106</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> +<div class="line"><a name="l10107"></a><span class="lineno">10107</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10108"></a><span class="lineno">10108</span>  }</div> +<div class="line"><a name="l10109"></a><span class="lineno">10109</span>  }</div> +<div class="line"><a name="l10110"></a><span class="lineno">10110</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10111"></a><span class="lineno">10111</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l10112"></a><span class="lineno">10112</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10113"></a><span class="lineno">10113</span>  }</div> +<div class="line"><a name="l10114"></a><span class="lineno">10114</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> +<div class="line"><a name="l10115"></a><span class="lineno">10115</span>  {</div> +<div class="line"><a name="l10116"></a><span class="lineno">10116</span>  *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div> +<div class="line"><a name="l10117"></a><span class="lineno">10117</span>  }</div> +<div class="line"><a name="l10118"></a><span class="lineno">10118</span>  }</div> +<div class="line"><a name="l10119"></a><span class="lineno">10119</span>  </div> +<div class="line"><a name="l10120"></a><span class="lineno">10120</span>  <span class="comment">// Calculate padding at the beginning based on current offset.</span></div> +<div class="line"><a name="l10121"></a><span class="lineno">10121</span>  <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div> +<div class="line"><a name="l10122"></a><span class="lineno">10122</span>  </div> +<div class="line"><a name="l10123"></a><span class="lineno">10123</span>  <span class="comment">// Calculate required margin at the end.</span></div> +<div class="line"><a name="l10124"></a><span class="lineno">10124</span>  <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10125"></a><span class="lineno">10125</span>  </div> +<div class="line"><a name="l10126"></a><span class="lineno">10126</span>  <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div> +<div class="line"><a name="l10127"></a><span class="lineno">10127</span>  <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin > suballoc.size)</div> +<div class="line"><a name="l10128"></a><span class="lineno">10128</span>  {</div> +<div class="line"><a name="l10129"></a><span class="lineno">10129</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10130"></a><span class="lineno">10130</span>  }</div> +<div class="line"><a name="l10131"></a><span class="lineno">10131</span>  </div> +<div class="line"><a name="l10132"></a><span class="lineno">10132</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l10133"></a><span class="lineno">10133</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> +<div class="line"><a name="l10134"></a><span class="lineno">10134</span>  <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || *pOffset % bufferImageGranularity)</div> +<div class="line"><a name="l10135"></a><span class="lineno">10135</span>  {</div> +<div class="line"><a name="l10136"></a><span class="lineno">10136</span>  VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div> +<div class="line"><a name="l10137"></a><span class="lineno">10137</span>  ++nextSuballocItem;</div> +<div class="line"><a name="l10138"></a><span class="lineno">10138</span>  <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div> +<div class="line"><a name="l10139"></a><span class="lineno">10139</span>  {</div> +<div class="line"><a name="l10140"></a><span class="lineno">10140</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = *nextSuballocItem;</div> +<div class="line"><a name="l10141"></a><span class="lineno">10141</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l10142"></a><span class="lineno">10142</span>  {</div> +<div class="line"><a name="l10143"></a><span class="lineno">10143</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> +<div class="line"><a name="l10144"></a><span class="lineno">10144</span>  {</div> +<div class="line"><a name="l10145"></a><span class="lineno">10145</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10146"></a><span class="lineno">10146</span>  }</div> +<div class="line"><a name="l10147"></a><span class="lineno">10147</span>  }</div> +<div class="line"><a name="l10148"></a><span class="lineno">10148</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10149"></a><span class="lineno">10149</span>  {</div> +<div class="line"><a name="l10150"></a><span class="lineno">10150</span>  <span class="comment">// Already on next page.</span></div> +<div class="line"><a name="l10151"></a><span class="lineno">10151</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10152"></a><span class="lineno">10152</span>  }</div> +<div class="line"><a name="l10153"></a><span class="lineno">10153</span>  ++nextSuballocItem;</div> +<div class="line"><a name="l10154"></a><span class="lineno">10154</span>  }</div> +<div class="line"><a name="l10155"></a><span class="lineno">10155</span>  }</div> +<div class="line"><a name="l10156"></a><span class="lineno">10156</span>  }</div> +<div class="line"><a name="l10157"></a><span class="lineno">10157</span>  </div> +<div class="line"><a name="l10158"></a><span class="lineno">10158</span>  <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div> +<div class="line"><a name="l10159"></a><span class="lineno">10159</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l10160"></a><span class="lineno">10160</span> }</div> +<div class="line"><a name="l10161"></a><span class="lineno">10161</span>  </div> +<div class="line"><a name="l10162"></a><span class="lineno">10162</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div> +<div class="line"><a name="l10163"></a><span class="lineno">10163</span> {</div> +<div class="line"><a name="l10164"></a><span class="lineno">10164</span>  VMA_ASSERT(item != m_Suballocations.end());</div> +<div class="line"><a name="l10165"></a><span class="lineno">10165</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10166"></a><span class="lineno">10166</span>  </div> +<div class="line"><a name="l10167"></a><span class="lineno">10167</span>  VmaSuballocationList::iterator nextItem = item;</div> +<div class="line"><a name="l10168"></a><span class="lineno">10168</span>  ++nextItem;</div> +<div class="line"><a name="l10169"></a><span class="lineno">10169</span>  VMA_ASSERT(nextItem != m_Suballocations.end());</div> +<div class="line"><a name="l10170"></a><span class="lineno">10170</span>  VMA_ASSERT(nextItem->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10171"></a><span class="lineno">10171</span>  </div> +<div class="line"><a name="l10172"></a><span class="lineno">10172</span>  item->size += nextItem->size;</div> +<div class="line"><a name="l10173"></a><span class="lineno">10173</span>  --m_FreeCount;</div> +<div class="line"><a name="l10174"></a><span class="lineno">10174</span>  m_Suballocations.erase(nextItem);</div> <div class="line"><a name="l10175"></a><span class="lineno">10175</span> }</div> <div class="line"><a name="l10176"></a><span class="lineno">10176</span>  </div> -<div class="line"><a name="l10177"></a><span class="lineno">10177</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> -<div class="line"><a name="l10178"></a><span class="lineno">10178</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l10179"></a><span class="lineno">10179</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l10180"></a><span class="lineno">10180</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l10181"></a><span class="lineno">10181</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10182"></a><span class="lineno">10182</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> -<div class="line"><a name="l10183"></a><span class="lineno">10183</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> -<div class="line"><a name="l10184"></a><span class="lineno">10184</span>  </div> -<div class="line"><a name="l10185"></a><span class="lineno">10185</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> -<div class="line"><a name="l10186"></a><span class="lineno">10186</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div> -<div class="line"><a name="l10187"></a><span class="lineno">10187</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> -<div class="line"><a name="l10188"></a><span class="lineno">10188</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div> -<div class="line"><a name="l10189"></a><span class="lineno">10189</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l10190"></a><span class="lineno">10190</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div> -<div class="line"><a name="l10191"></a><span class="lineno">10191</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l10192"></a><span class="lineno">10192</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> -<div class="line"><a name="l10193"></a><span class="lineno">10193</span>  </div> -<div class="line"><a name="l10194"></a><span class="lineno">10194</span>  VkDeviceSize lastOffset = 0;</div> -<div class="line"><a name="l10195"></a><span class="lineno">10195</span>  </div> -<div class="line"><a name="l10196"></a><span class="lineno">10196</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l10197"></a><span class="lineno">10197</span>  {</div> -<div class="line"><a name="l10198"></a><span class="lineno">10198</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> -<div class="line"><a name="l10199"></a><span class="lineno">10199</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div> -<div class="line"><a name="l10200"></a><span class="lineno">10200</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10201"></a><span class="lineno">10201</span>  {</div> -<div class="line"><a name="l10202"></a><span class="lineno">10202</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10203"></a><span class="lineno">10203</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> -<div class="line"><a name="l10204"></a><span class="lineno">10204</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10205"></a><span class="lineno">10205</span>  {</div> -<div class="line"><a name="l10206"></a><span class="lineno">10206</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10207"></a><span class="lineno">10207</span>  }</div> +<div class="line"><a name="l10177"></a><span class="lineno">10177</span> VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div> +<div class="line"><a name="l10178"></a><span class="lineno">10178</span> {</div> +<div class="line"><a name="l10179"></a><span class="lineno">10179</span>  <span class="comment">// Change this suballocation to be marked as free.</span></div> +<div class="line"><a name="l10180"></a><span class="lineno">10180</span>  VmaSuballocation& suballoc = *suballocItem;</div> +<div class="line"><a name="l10181"></a><span class="lineno">10181</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l10182"></a><span class="lineno">10182</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l10183"></a><span class="lineno">10183</span>  </div> +<div class="line"><a name="l10184"></a><span class="lineno">10184</span>  <span class="comment">// Update totals.</span></div> +<div class="line"><a name="l10185"></a><span class="lineno">10185</span>  ++m_FreeCount;</div> +<div class="line"><a name="l10186"></a><span class="lineno">10186</span>  m_SumFreeSize += suballoc.size;</div> +<div class="line"><a name="l10187"></a><span class="lineno">10187</span>  </div> +<div class="line"><a name="l10188"></a><span class="lineno">10188</span>  <span class="comment">// Merge with previous and/or next suballocation if it's also free.</span></div> +<div class="line"><a name="l10189"></a><span class="lineno">10189</span>  <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div> +<div class="line"><a name="l10190"></a><span class="lineno">10190</span>  <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div> +<div class="line"><a name="l10191"></a><span class="lineno">10191</span>  </div> +<div class="line"><a name="l10192"></a><span class="lineno">10192</span>  VmaSuballocationList::iterator nextItem = suballocItem;</div> +<div class="line"><a name="l10193"></a><span class="lineno">10193</span>  ++nextItem;</div> +<div class="line"><a name="l10194"></a><span class="lineno">10194</span>  <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) && (nextItem->type == VMA_SUBALLOCATION_TYPE_FREE))</div> +<div class="line"><a name="l10195"></a><span class="lineno">10195</span>  {</div> +<div class="line"><a name="l10196"></a><span class="lineno">10196</span>  mergeWithNext = <span class="keyword">true</span>;</div> +<div class="line"><a name="l10197"></a><span class="lineno">10197</span>  }</div> +<div class="line"><a name="l10198"></a><span class="lineno">10198</span>  </div> +<div class="line"><a name="l10199"></a><span class="lineno">10199</span>  VmaSuballocationList::iterator prevItem = suballocItem;</div> +<div class="line"><a name="l10200"></a><span class="lineno">10200</span>  <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div> +<div class="line"><a name="l10201"></a><span class="lineno">10201</span>  {</div> +<div class="line"><a name="l10202"></a><span class="lineno">10202</span>  --prevItem;</div> +<div class="line"><a name="l10203"></a><span class="lineno">10203</span>  <span class="keywordflow">if</span>(prevItem->type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l10204"></a><span class="lineno">10204</span>  {</div> +<div class="line"><a name="l10205"></a><span class="lineno">10205</span>  mergeWithPrev = <span class="keyword">true</span>;</div> +<div class="line"><a name="l10206"></a><span class="lineno">10206</span>  }</div> +<div class="line"><a name="l10207"></a><span class="lineno">10207</span>  }</div> <div class="line"><a name="l10208"></a><span class="lineno">10208</span>  </div> -<div class="line"><a name="l10209"></a><span class="lineno">10209</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10210"></a><span class="lineno">10210</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> -<div class="line"><a name="l10211"></a><span class="lineno">10211</span>  {</div> -<div class="line"><a name="l10212"></a><span class="lineno">10212</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10213"></a><span class="lineno">10213</span>  </div> -<div class="line"><a name="l10214"></a><span class="lineno">10214</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10215"></a><span class="lineno">10215</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10216"></a><span class="lineno">10216</span>  {</div> -<div class="line"><a name="l10217"></a><span class="lineno">10217</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10218"></a><span class="lineno">10218</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10219"></a><span class="lineno">10219</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10220"></a><span class="lineno">10220</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10221"></a><span class="lineno">10221</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10222"></a><span class="lineno">10222</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10223"></a><span class="lineno">10223</span>  }</div> -<div class="line"><a name="l10224"></a><span class="lineno">10224</span>  </div> -<div class="line"><a name="l10225"></a><span class="lineno">10225</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10226"></a><span class="lineno">10226</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10227"></a><span class="lineno">10227</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> -<div class="line"><a name="l10228"></a><span class="lineno">10228</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> -<div class="line"><a name="l10229"></a><span class="lineno">10229</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> -<div class="line"><a name="l10230"></a><span class="lineno">10230</span>  </div> -<div class="line"><a name="l10231"></a><span class="lineno">10231</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10232"></a><span class="lineno">10232</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10233"></a><span class="lineno">10233</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10234"></a><span class="lineno">10234</span>  }</div> -<div class="line"><a name="l10235"></a><span class="lineno">10235</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10236"></a><span class="lineno">10236</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10237"></a><span class="lineno">10237</span>  {</div> -<div class="line"><a name="l10238"></a><span class="lineno">10238</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> -<div class="line"><a name="l10239"></a><span class="lineno">10239</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10240"></a><span class="lineno">10240</span>  {</div> -<div class="line"><a name="l10241"></a><span class="lineno">10241</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> -<div class="line"><a name="l10242"></a><span class="lineno">10242</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10243"></a><span class="lineno">10243</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10244"></a><span class="lineno">10244</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10245"></a><span class="lineno">10245</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10246"></a><span class="lineno">10246</span>  }</div> -<div class="line"><a name="l10247"></a><span class="lineno">10247</span>  </div> -<div class="line"><a name="l10248"></a><span class="lineno">10248</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10249"></a><span class="lineno">10249</span>  lastOffset = freeSpace2ndTo1stEnd;</div> -<div class="line"><a name="l10250"></a><span class="lineno">10250</span>  }</div> -<div class="line"><a name="l10251"></a><span class="lineno">10251</span>  }</div> -<div class="line"><a name="l10252"></a><span class="lineno">10252</span>  }</div> +<div class="line"><a name="l10209"></a><span class="lineno">10209</span>  <span class="keywordflow">if</span>(mergeWithNext)</div> +<div class="line"><a name="l10210"></a><span class="lineno">10210</span>  {</div> +<div class="line"><a name="l10211"></a><span class="lineno">10211</span>  UnregisterFreeSuballocation(nextItem);</div> +<div class="line"><a name="l10212"></a><span class="lineno">10212</span>  MergeFreeWithNext(suballocItem);</div> +<div class="line"><a name="l10213"></a><span class="lineno">10213</span>  }</div> +<div class="line"><a name="l10214"></a><span class="lineno">10214</span>  </div> +<div class="line"><a name="l10215"></a><span class="lineno">10215</span>  <span class="keywordflow">if</span>(mergeWithPrev)</div> +<div class="line"><a name="l10216"></a><span class="lineno">10216</span>  {</div> +<div class="line"><a name="l10217"></a><span class="lineno">10217</span>  UnregisterFreeSuballocation(prevItem);</div> +<div class="line"><a name="l10218"></a><span class="lineno">10218</span>  MergeFreeWithNext(prevItem);</div> +<div class="line"><a name="l10219"></a><span class="lineno">10219</span>  RegisterFreeSuballocation(prevItem);</div> +<div class="line"><a name="l10220"></a><span class="lineno">10220</span>  <span class="keywordflow">return</span> prevItem;</div> +<div class="line"><a name="l10221"></a><span class="lineno">10221</span>  }</div> +<div class="line"><a name="l10222"></a><span class="lineno">10222</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10223"></a><span class="lineno">10223</span>  {</div> +<div class="line"><a name="l10224"></a><span class="lineno">10224</span>  RegisterFreeSuballocation(suballocItem);</div> +<div class="line"><a name="l10225"></a><span class="lineno">10225</span>  <span class="keywordflow">return</span> suballocItem;</div> +<div class="line"><a name="l10226"></a><span class="lineno">10226</span>  }</div> +<div class="line"><a name="l10227"></a><span class="lineno">10227</span> }</div> +<div class="line"><a name="l10228"></a><span class="lineno">10228</span>  </div> +<div class="line"><a name="l10229"></a><span class="lineno">10229</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div> +<div class="line"><a name="l10230"></a><span class="lineno">10230</span> {</div> +<div class="line"><a name="l10231"></a><span class="lineno">10231</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10232"></a><span class="lineno">10232</span>  VMA_ASSERT(item->size > 0);</div> +<div class="line"><a name="l10233"></a><span class="lineno">10233</span>  </div> +<div class="line"><a name="l10234"></a><span class="lineno">10234</span>  <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div> +<div class="line"><a name="l10235"></a><span class="lineno">10235</span>  <span class="comment">// this function, depending on what do you want to check.</span></div> +<div class="line"><a name="l10236"></a><span class="lineno">10236</span>  VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div> +<div class="line"><a name="l10237"></a><span class="lineno">10237</span>  </div> +<div class="line"><a name="l10238"></a><span class="lineno">10238</span>  <span class="keywordflow">if</span>(item->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> +<div class="line"><a name="l10239"></a><span class="lineno">10239</span>  {</div> +<div class="line"><a name="l10240"></a><span class="lineno">10240</span>  <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div> +<div class="line"><a name="l10241"></a><span class="lineno">10241</span>  {</div> +<div class="line"><a name="l10242"></a><span class="lineno">10242</span>  m_FreeSuballocationsBySize.push_back(item);</div> +<div class="line"><a name="l10243"></a><span class="lineno">10243</span>  }</div> +<div class="line"><a name="l10244"></a><span class="lineno">10244</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10245"></a><span class="lineno">10245</span>  {</div> +<div class="line"><a name="l10246"></a><span class="lineno">10246</span>  VmaVectorInsertSorted<VmaSuballocationItemSizeLess>(m_FreeSuballocationsBySize, item);</div> +<div class="line"><a name="l10247"></a><span class="lineno">10247</span>  }</div> +<div class="line"><a name="l10248"></a><span class="lineno">10248</span>  }</div> +<div class="line"><a name="l10249"></a><span class="lineno">10249</span>  </div> +<div class="line"><a name="l10250"></a><span class="lineno">10250</span>  <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div> +<div class="line"><a name="l10251"></a><span class="lineno">10251</span> }</div> +<div class="line"><a name="l10252"></a><span class="lineno">10252</span>  </div> <div class="line"><a name="l10253"></a><span class="lineno">10253</span>  </div> -<div class="line"><a name="l10254"></a><span class="lineno">10254</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10255"></a><span class="lineno">10255</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> -<div class="line"><a name="l10256"></a><span class="lineno">10256</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> -<div class="line"><a name="l10257"></a><span class="lineno">10257</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10258"></a><span class="lineno">10258</span>  {</div> -<div class="line"><a name="l10259"></a><span class="lineno">10259</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10260"></a><span class="lineno">10260</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> -<div class="line"><a name="l10261"></a><span class="lineno">10261</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10262"></a><span class="lineno">10262</span>  {</div> -<div class="line"><a name="l10263"></a><span class="lineno">10263</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10264"></a><span class="lineno">10264</span>  }</div> -<div class="line"><a name="l10265"></a><span class="lineno">10265</span>  </div> -<div class="line"><a name="l10266"></a><span class="lineno">10266</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10267"></a><span class="lineno">10267</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> -<div class="line"><a name="l10268"></a><span class="lineno">10268</span>  {</div> -<div class="line"><a name="l10269"></a><span class="lineno">10269</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> -<div class="line"><a name="l10270"></a><span class="lineno">10270</span>  </div> -<div class="line"><a name="l10271"></a><span class="lineno">10271</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10272"></a><span class="lineno">10272</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10273"></a><span class="lineno">10273</span>  {</div> -<div class="line"><a name="l10274"></a><span class="lineno">10274</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10275"></a><span class="lineno">10275</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10276"></a><span class="lineno">10276</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10277"></a><span class="lineno">10277</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10278"></a><span class="lineno">10278</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10279"></a><span class="lineno">10279</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10280"></a><span class="lineno">10280</span>  }</div> -<div class="line"><a name="l10281"></a><span class="lineno">10281</span>  </div> -<div class="line"><a name="l10282"></a><span class="lineno">10282</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10283"></a><span class="lineno">10283</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10284"></a><span class="lineno">10284</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> -<div class="line"><a name="l10285"></a><span class="lineno">10285</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> -<div class="line"><a name="l10286"></a><span class="lineno">10286</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> -<div class="line"><a name="l10287"></a><span class="lineno">10287</span>  </div> -<div class="line"><a name="l10288"></a><span class="lineno">10288</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10289"></a><span class="lineno">10289</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10290"></a><span class="lineno">10290</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10291"></a><span class="lineno">10291</span>  }</div> -<div class="line"><a name="l10292"></a><span class="lineno">10292</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10293"></a><span class="lineno">10293</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10294"></a><span class="lineno">10294</span>  {</div> -<div class="line"><a name="l10295"></a><span class="lineno">10295</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> -<div class="line"><a name="l10296"></a><span class="lineno">10296</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10297"></a><span class="lineno">10297</span>  {</div> -<div class="line"><a name="l10298"></a><span class="lineno">10298</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> -<div class="line"><a name="l10299"></a><span class="lineno">10299</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10300"></a><span class="lineno">10300</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10301"></a><span class="lineno">10301</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10302"></a><span class="lineno">10302</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10303"></a><span class="lineno">10303</span>  }</div> -<div class="line"><a name="l10304"></a><span class="lineno">10304</span>  </div> -<div class="line"><a name="l10305"></a><span class="lineno">10305</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10306"></a><span class="lineno">10306</span>  lastOffset = freeSpace1stTo2ndEnd;</div> -<div class="line"><a name="l10307"></a><span class="lineno">10307</span>  }</div> -<div class="line"><a name="l10308"></a><span class="lineno">10308</span>  }</div> -<div class="line"><a name="l10309"></a><span class="lineno">10309</span>  </div> -<div class="line"><a name="l10310"></a><span class="lineno">10310</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l10311"></a><span class="lineno">10311</span>  {</div> -<div class="line"><a name="l10312"></a><span class="lineno">10312</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> -<div class="line"><a name="l10313"></a><span class="lineno">10313</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> -<div class="line"><a name="l10314"></a><span class="lineno">10314</span>  {</div> -<div class="line"><a name="l10315"></a><span class="lineno">10315</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10316"></a><span class="lineno">10316</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> -<div class="line"><a name="l10317"></a><span class="lineno">10317</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10318"></a><span class="lineno">10318</span>  {</div> -<div class="line"><a name="l10319"></a><span class="lineno">10319</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10320"></a><span class="lineno">10320</span>  }</div> -<div class="line"><a name="l10321"></a><span class="lineno">10321</span>  </div> -<div class="line"><a name="l10322"></a><span class="lineno">10322</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10323"></a><span class="lineno">10323</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> -<div class="line"><a name="l10324"></a><span class="lineno">10324</span>  {</div> -<div class="line"><a name="l10325"></a><span class="lineno">10325</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10326"></a><span class="lineno">10326</span>  </div> -<div class="line"><a name="l10327"></a><span class="lineno">10327</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10328"></a><span class="lineno">10328</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10329"></a><span class="lineno">10329</span>  {</div> -<div class="line"><a name="l10330"></a><span class="lineno">10330</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10331"></a><span class="lineno">10331</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10332"></a><span class="lineno">10332</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10333"></a><span class="lineno">10333</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10334"></a><span class="lineno">10334</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10335"></a><span class="lineno">10335</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10336"></a><span class="lineno">10336</span>  }</div> -<div class="line"><a name="l10337"></a><span class="lineno">10337</span>  </div> -<div class="line"><a name="l10338"></a><span class="lineno">10338</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10339"></a><span class="lineno">10339</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10340"></a><span class="lineno">10340</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> -<div class="line"><a name="l10341"></a><span class="lineno">10341</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> -<div class="line"><a name="l10342"></a><span class="lineno">10342</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> -<div class="line"><a name="l10343"></a><span class="lineno">10343</span>  </div> -<div class="line"><a name="l10344"></a><span class="lineno">10344</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10345"></a><span class="lineno">10345</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10346"></a><span class="lineno">10346</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10347"></a><span class="lineno">10347</span>  }</div> -<div class="line"><a name="l10348"></a><span class="lineno">10348</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10349"></a><span class="lineno">10349</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10350"></a><span class="lineno">10350</span>  {</div> -<div class="line"><a name="l10351"></a><span class="lineno">10351</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> -<div class="line"><a name="l10352"></a><span class="lineno">10352</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> -<div class="line"><a name="l10353"></a><span class="lineno">10353</span>  {</div> -<div class="line"><a name="l10354"></a><span class="lineno">10354</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> -<div class="line"><a name="l10355"></a><span class="lineno">10355</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l10356"></a><span class="lineno">10356</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l10357"></a><span class="lineno">10357</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="l10358"></a><span class="lineno">10358</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10359"></a><span class="lineno">10359</span>  }</div> -<div class="line"><a name="l10360"></a><span class="lineno">10360</span>  </div> -<div class="line"><a name="l10361"></a><span class="lineno">10361</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10362"></a><span class="lineno">10362</span>  lastOffset = size;</div> -<div class="line"><a name="l10363"></a><span class="lineno">10363</span>  }</div> -<div class="line"><a name="l10364"></a><span class="lineno">10364</span>  }</div> -<div class="line"><a name="l10365"></a><span class="lineno">10365</span>  }</div> -<div class="line"><a name="l10366"></a><span class="lineno">10366</span>  </div> -<div class="line"><a name="l10367"></a><span class="lineno">10367</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> -<div class="line"><a name="l10368"></a><span class="lineno">10368</span> }</div> -<div class="line"><a name="l10369"></a><span class="lineno">10369</span>  </div> -<div class="line"><a name="l10370"></a><span class="lineno">10370</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> -<div class="line"><a name="l10371"></a><span class="lineno">10371</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l10372"></a><span class="lineno">10372</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l10373"></a><span class="lineno">10373</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10374"></a><span class="lineno">10374</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l10375"></a><span class="lineno">10375</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> -<div class="line"><a name="l10376"></a><span class="lineno">10376</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> -<div class="line"><a name="l10377"></a><span class="lineno">10377</span>  </div> -<div class="line"><a name="l10378"></a><span class="lineno">10378</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div> -<div class="line"><a name="l10379"></a><span class="lineno">10379</span>  </div> -<div class="line"><a name="l10380"></a><span class="lineno">10380</span>  VkDeviceSize lastOffset = 0;</div> +<div class="line"><a name="l10254"></a><span class="lineno">10254</span> <span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div> +<div class="line"><a name="l10255"></a><span class="lineno">10255</span> {</div> +<div class="line"><a name="l10256"></a><span class="lineno">10256</span>  VMA_ASSERT(item->type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10257"></a><span class="lineno">10257</span>  VMA_ASSERT(item->size > 0);</div> +<div class="line"><a name="l10258"></a><span class="lineno">10258</span>  </div> +<div class="line"><a name="l10259"></a><span class="lineno">10259</span>  <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div> +<div class="line"><a name="l10260"></a><span class="lineno">10260</span>  <span class="comment">// this function, depending on what do you want to check.</span></div> +<div class="line"><a name="l10261"></a><span class="lineno">10261</span>  VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div> +<div class="line"><a name="l10262"></a><span class="lineno">10262</span>  </div> +<div class="line"><a name="l10263"></a><span class="lineno">10263</span>  <span class="keywordflow">if</span>(item->size >= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div> +<div class="line"><a name="l10264"></a><span class="lineno">10264</span>  {</div> +<div class="line"><a name="l10265"></a><span class="lineno">10265</span>  VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div> +<div class="line"><a name="l10266"></a><span class="lineno">10266</span>  m_FreeSuballocationsBySize.data(),</div> +<div class="line"><a name="l10267"></a><span class="lineno">10267</span>  m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div> +<div class="line"><a name="l10268"></a><span class="lineno">10268</span>  item,</div> +<div class="line"><a name="l10269"></a><span class="lineno">10269</span>  VmaSuballocationItemSizeLess());</div> +<div class="line"><a name="l10270"></a><span class="lineno">10270</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div> +<div class="line"><a name="l10271"></a><span class="lineno">10271</span>  index < m_FreeSuballocationsBySize.size();</div> +<div class="line"><a name="l10272"></a><span class="lineno">10272</span>  ++index)</div> +<div class="line"><a name="l10273"></a><span class="lineno">10273</span>  {</div> +<div class="line"><a name="l10274"></a><span class="lineno">10274</span>  <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div> +<div class="line"><a name="l10275"></a><span class="lineno">10275</span>  {</div> +<div class="line"><a name="l10276"></a><span class="lineno">10276</span>  VmaVectorRemove(m_FreeSuballocationsBySize, index);</div> +<div class="line"><a name="l10277"></a><span class="lineno">10277</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l10278"></a><span class="lineno">10278</span>  }</div> +<div class="line"><a name="l10279"></a><span class="lineno">10279</span>  VMA_ASSERT((m_FreeSuballocationsBySize[index]->size == item->size) && <span class="stringliteral">"Not found."</span>);</div> +<div class="line"><a name="l10280"></a><span class="lineno">10280</span>  }</div> +<div class="line"><a name="l10281"></a><span class="lineno">10281</span>  VMA_ASSERT(0 && <span class="stringliteral">"Not found."</span>);</div> +<div class="line"><a name="l10282"></a><span class="lineno">10282</span>  }</div> +<div class="line"><a name="l10283"></a><span class="lineno">10283</span>  </div> +<div class="line"><a name="l10284"></a><span class="lineno">10284</span>  <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div> +<div class="line"><a name="l10285"></a><span class="lineno">10285</span> }</div> +<div class="line"><a name="l10286"></a><span class="lineno">10286</span>  </div> +<div class="line"><a name="l10287"></a><span class="lineno">10287</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsBufferImageGranularityConflictPossible(</div> +<div class="line"><a name="l10288"></a><span class="lineno">10288</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l10289"></a><span class="lineno">10289</span>  VmaSuballocationType& inOutPrevSuballocType)<span class="keyword"> const</span></div> +<div class="line"><a name="l10290"></a><span class="lineno">10290</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10291"></a><span class="lineno">10291</span>  <span class="keywordflow">if</span>(bufferImageGranularity == 1 || IsEmpty())</div> +<div class="line"><a name="l10292"></a><span class="lineno">10292</span>  {</div> +<div class="line"><a name="l10293"></a><span class="lineno">10293</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l10294"></a><span class="lineno">10294</span>  }</div> +<div class="line"><a name="l10295"></a><span class="lineno">10295</span>  </div> +<div class="line"><a name="l10296"></a><span class="lineno">10296</span>  VkDeviceSize minAlignment = VK_WHOLE_SIZE;</div> +<div class="line"><a name="l10297"></a><span class="lineno">10297</span>  <span class="keywordtype">bool</span> typeConflictFound = <span class="keyword">false</span>;</div> +<div class="line"><a name="l10298"></a><span class="lineno">10298</span>  <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator it = m_Suballocations.cbegin();</div> +<div class="line"><a name="l10299"></a><span class="lineno">10299</span>  it != m_Suballocations.cend();</div> +<div class="line"><a name="l10300"></a><span class="lineno">10300</span>  ++it)</div> +<div class="line"><a name="l10301"></a><span class="lineno">10301</span>  {</div> +<div class="line"><a name="l10302"></a><span class="lineno">10302</span>  <span class="keyword">const</span> VmaSuballocationType suballocType = it->type;</div> +<div class="line"><a name="l10303"></a><span class="lineno">10303</span>  <span class="keywordflow">if</span>(suballocType != VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l10304"></a><span class="lineno">10304</span>  {</div> +<div class="line"><a name="l10305"></a><span class="lineno">10305</span>  minAlignment = VMA_MIN(minAlignment, it->hAllocation->GetAlignment());</div> +<div class="line"><a name="l10306"></a><span class="lineno">10306</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(inOutPrevSuballocType, suballocType))</div> +<div class="line"><a name="l10307"></a><span class="lineno">10307</span>  {</div> +<div class="line"><a name="l10308"></a><span class="lineno">10308</span>  typeConflictFound = <span class="keyword">true</span>;</div> +<div class="line"><a name="l10309"></a><span class="lineno">10309</span>  }</div> +<div class="line"><a name="l10310"></a><span class="lineno">10310</span>  inOutPrevSuballocType = suballocType;</div> +<div class="line"><a name="l10311"></a><span class="lineno">10311</span>  }</div> +<div class="line"><a name="l10312"></a><span class="lineno">10312</span>  }</div> +<div class="line"><a name="l10313"></a><span class="lineno">10313</span>  </div> +<div class="line"><a name="l10314"></a><span class="lineno">10314</span>  <span class="keywordflow">return</span> typeConflictFound || minAlignment >= bufferImageGranularity;</div> +<div class="line"><a name="l10315"></a><span class="lineno">10315</span> }</div> +<div class="line"><a name="l10316"></a><span class="lineno">10316</span>  </div> +<div class="line"><a name="l10318"></a><span class="lineno">10318</span> <span class="comment">// class VmaBlockMetadata_Linear</span></div> +<div class="line"><a name="l10319"></a><span class="lineno">10319</span>  </div> +<div class="line"><a name="l10320"></a><span class="lineno">10320</span> VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> +<div class="line"><a name="l10321"></a><span class="lineno">10321</span>  VmaBlockMetadata(hAllocator),</div> +<div class="line"><a name="l10322"></a><span class="lineno">10322</span>  m_SumFreeSize(0),</div> +<div class="line"><a name="l10323"></a><span class="lineno">10323</span>  m_Suballocations0(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> +<div class="line"><a name="l10324"></a><span class="lineno">10324</span>  m_Suballocations1(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),</div> +<div class="line"><a name="l10325"></a><span class="lineno">10325</span>  m_1stVectorIndex(0),</div> +<div class="line"><a name="l10326"></a><span class="lineno">10326</span>  m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div> +<div class="line"><a name="l10327"></a><span class="lineno">10327</span>  m_1stNullItemsBeginCount(0),</div> +<div class="line"><a name="l10328"></a><span class="lineno">10328</span>  m_1stNullItemsMiddleCount(0),</div> +<div class="line"><a name="l10329"></a><span class="lineno">10329</span>  m_2ndNullItemsCount(0)</div> +<div class="line"><a name="l10330"></a><span class="lineno">10330</span> {</div> +<div class="line"><a name="l10331"></a><span class="lineno">10331</span> }</div> +<div class="line"><a name="l10332"></a><span class="lineno">10332</span>  </div> +<div class="line"><a name="l10333"></a><span class="lineno">10333</span> VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</div> +<div class="line"><a name="l10334"></a><span class="lineno">10334</span> {</div> +<div class="line"><a name="l10335"></a><span class="lineno">10335</span> }</div> +<div class="line"><a name="l10336"></a><span class="lineno">10336</span>  </div> +<div class="line"><a name="l10337"></a><span class="lineno">10337</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</div> +<div class="line"><a name="l10338"></a><span class="lineno">10338</span> {</div> +<div class="line"><a name="l10339"></a><span class="lineno">10339</span>  VmaBlockMetadata::Init(size);</div> +<div class="line"><a name="l10340"></a><span class="lineno">10340</span>  m_SumFreeSize = size;</div> +<div class="line"><a name="l10341"></a><span class="lineno">10341</span> }</div> +<div class="line"><a name="l10342"></a><span class="lineno">10342</span>  </div> +<div class="line"><a name="l10343"></a><span class="lineno">10343</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div> +<div class="line"><a name="l10344"></a><span class="lineno">10344</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10345"></a><span class="lineno">10345</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l10346"></a><span class="lineno">10346</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10347"></a><span class="lineno">10347</span>  </div> +<div class="line"><a name="l10348"></a><span class="lineno">10348</span>  VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div> +<div class="line"><a name="l10349"></a><span class="lineno">10349</span>  VMA_VALIDATE(!suballocations1st.empty() ||</div> +<div class="line"><a name="l10350"></a><span class="lineno">10350</span>  suballocations2nd.empty() ||</div> +<div class="line"><a name="l10351"></a><span class="lineno">10351</span>  m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div> +<div class="line"><a name="l10352"></a><span class="lineno">10352</span>  </div> +<div class="line"><a name="l10353"></a><span class="lineno">10353</span>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> +<div class="line"><a name="l10354"></a><span class="lineno">10354</span>  {</div> +<div class="line"><a name="l10355"></a><span class="lineno">10355</span>  <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div> +<div class="line"><a name="l10356"></a><span class="lineno">10356</span>  VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l10357"></a><span class="lineno">10357</span>  <span class="comment">// Null item at the end should be just pop_back().</span></div> +<div class="line"><a name="l10358"></a><span class="lineno">10358</span>  VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l10359"></a><span class="lineno">10359</span>  }</div> +<div class="line"><a name="l10360"></a><span class="lineno">10360</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> +<div class="line"><a name="l10361"></a><span class="lineno">10361</span>  {</div> +<div class="line"><a name="l10362"></a><span class="lineno">10362</span>  <span class="comment">// Null item at the end should be just pop_back().</span></div> +<div class="line"><a name="l10363"></a><span class="lineno">10363</span>  VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l10364"></a><span class="lineno">10364</span>  }</div> +<div class="line"><a name="l10365"></a><span class="lineno">10365</span>  </div> +<div class="line"><a name="l10366"></a><span class="lineno">10366</span>  VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount <= suballocations1st.size());</div> +<div class="line"><a name="l10367"></a><span class="lineno">10367</span>  VMA_VALIDATE(m_2ndNullItemsCount <= suballocations2nd.size());</div> +<div class="line"><a name="l10368"></a><span class="lineno">10368</span>  </div> +<div class="line"><a name="l10369"></a><span class="lineno">10369</span>  VkDeviceSize sumUsedSize = 0;</div> +<div class="line"><a name="l10370"></a><span class="lineno">10370</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> +<div class="line"><a name="l10371"></a><span class="lineno">10371</span>  VkDeviceSize offset = VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10372"></a><span class="lineno">10372</span>  </div> +<div class="line"><a name="l10373"></a><span class="lineno">10373</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l10374"></a><span class="lineno">10374</span>  {</div> +<div class="line"><a name="l10375"></a><span class="lineno">10375</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> +<div class="line"><a name="l10376"></a><span class="lineno">10376</span>  <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div> +<div class="line"><a name="l10377"></a><span class="lineno">10377</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < suballoc2ndCount; ++i)</div> +<div class="line"><a name="l10378"></a><span class="lineno">10378</span>  {</div> +<div class="line"><a name="l10379"></a><span class="lineno">10379</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> +<div class="line"><a name="l10380"></a><span class="lineno">10380</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> <div class="line"><a name="l10381"></a><span class="lineno">10381</span>  </div> -<div class="line"><a name="l10382"></a><span class="lineno">10382</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l10383"></a><span class="lineno">10383</span>  {</div> -<div class="line"><a name="l10384"></a><span class="lineno">10384</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> -<div class="line"><a name="l10385"></a><span class="lineno">10385</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10386"></a><span class="lineno">10386</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10387"></a><span class="lineno">10387</span>  {</div> -<div class="line"><a name="l10388"></a><span class="lineno">10388</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> -<div class="line"><a name="l10389"></a><span class="lineno">10389</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> -<div class="line"><a name="l10390"></a><span class="lineno">10390</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10391"></a><span class="lineno">10391</span>  {</div> -<div class="line"><a name="l10392"></a><span class="lineno">10392</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10393"></a><span class="lineno">10393</span>  }</div> -<div class="line"><a name="l10394"></a><span class="lineno">10394</span>  </div> -<div class="line"><a name="l10395"></a><span class="lineno">10395</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10396"></a><span class="lineno">10396</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> -<div class="line"><a name="l10397"></a><span class="lineno">10397</span>  {</div> -<div class="line"><a name="l10398"></a><span class="lineno">10398</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10399"></a><span class="lineno">10399</span>  </div> -<div class="line"><a name="l10400"></a><span class="lineno">10400</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10401"></a><span class="lineno">10401</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10402"></a><span class="lineno">10402</span>  {</div> -<div class="line"><a name="l10403"></a><span class="lineno">10403</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10404"></a><span class="lineno">10404</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10405"></a><span class="lineno">10405</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10406"></a><span class="lineno">10406</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10407"></a><span class="lineno">10407</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10408"></a><span class="lineno">10408</span>  }</div> -<div class="line"><a name="l10409"></a><span class="lineno">10409</span>  </div> -<div class="line"><a name="l10410"></a><span class="lineno">10410</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10411"></a><span class="lineno">10411</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10412"></a><span class="lineno">10412</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> -<div class="line"><a name="l10413"></a><span class="lineno">10413</span>  </div> -<div class="line"><a name="l10414"></a><span class="lineno">10414</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10415"></a><span class="lineno">10415</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10416"></a><span class="lineno">10416</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10417"></a><span class="lineno">10417</span>  }</div> -<div class="line"><a name="l10418"></a><span class="lineno">10418</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10419"></a><span class="lineno">10419</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10420"></a><span class="lineno">10420</span>  {</div> -<div class="line"><a name="l10421"></a><span class="lineno">10421</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10422"></a><span class="lineno">10422</span>  {</div> -<div class="line"><a name="l10423"></a><span class="lineno">10423</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> -<div class="line"><a name="l10424"></a><span class="lineno">10424</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> -<div class="line"><a name="l10425"></a><span class="lineno">10425</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10426"></a><span class="lineno">10426</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10427"></a><span class="lineno">10427</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10428"></a><span class="lineno">10428</span>  }</div> -<div class="line"><a name="l10429"></a><span class="lineno">10429</span>  </div> -<div class="line"><a name="l10430"></a><span class="lineno">10430</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10431"></a><span class="lineno">10431</span>  lastOffset = freeSpace2ndTo1stEnd;</div> -<div class="line"><a name="l10432"></a><span class="lineno">10432</span>  }</div> -<div class="line"><a name="l10433"></a><span class="lineno">10433</span>  }</div> -<div class="line"><a name="l10434"></a><span class="lineno">10434</span>  }</div> -<div class="line"><a name="l10435"></a><span class="lineno">10435</span>  </div> -<div class="line"><a name="l10436"></a><span class="lineno">10436</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10437"></a><span class="lineno">10437</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> -<div class="line"><a name="l10438"></a><span class="lineno">10438</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> -<div class="line"><a name="l10439"></a><span class="lineno">10439</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10440"></a><span class="lineno">10440</span>  {</div> -<div class="line"><a name="l10441"></a><span class="lineno">10441</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10442"></a><span class="lineno">10442</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> -<div class="line"><a name="l10443"></a><span class="lineno">10443</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10444"></a><span class="lineno">10444</span>  {</div> -<div class="line"><a name="l10445"></a><span class="lineno">10445</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10446"></a><span class="lineno">10446</span>  }</div> -<div class="line"><a name="l10447"></a><span class="lineno">10447</span>  </div> -<div class="line"><a name="l10448"></a><span class="lineno">10448</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10449"></a><span class="lineno">10449</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> -<div class="line"><a name="l10450"></a><span class="lineno">10450</span>  {</div> -<div class="line"><a name="l10451"></a><span class="lineno">10451</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> -<div class="line"><a name="l10452"></a><span class="lineno">10452</span>  </div> -<div class="line"><a name="l10453"></a><span class="lineno">10453</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10454"></a><span class="lineno">10454</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10455"></a><span class="lineno">10455</span>  {</div> -<div class="line"><a name="l10456"></a><span class="lineno">10456</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10457"></a><span class="lineno">10457</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10458"></a><span class="lineno">10458</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10459"></a><span class="lineno">10459</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10460"></a><span class="lineno">10460</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10461"></a><span class="lineno">10461</span>  }</div> -<div class="line"><a name="l10462"></a><span class="lineno">10462</span>  </div> -<div class="line"><a name="l10463"></a><span class="lineno">10463</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10464"></a><span class="lineno">10464</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10465"></a><span class="lineno">10465</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> -<div class="line"><a name="l10466"></a><span class="lineno">10466</span>  </div> -<div class="line"><a name="l10467"></a><span class="lineno">10467</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10468"></a><span class="lineno">10468</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10469"></a><span class="lineno">10469</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10470"></a><span class="lineno">10470</span>  }</div> -<div class="line"><a name="l10471"></a><span class="lineno">10471</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10472"></a><span class="lineno">10472</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10473"></a><span class="lineno">10473</span>  {</div> -<div class="line"><a name="l10474"></a><span class="lineno">10474</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10475"></a><span class="lineno">10475</span>  {</div> -<div class="line"><a name="l10476"></a><span class="lineno">10476</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> -<div class="line"><a name="l10477"></a><span class="lineno">10477</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> -<div class="line"><a name="l10478"></a><span class="lineno">10478</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10479"></a><span class="lineno">10479</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10480"></a><span class="lineno">10480</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10481"></a><span class="lineno">10481</span>  }</div> -<div class="line"><a name="l10482"></a><span class="lineno">10482</span>  </div> -<div class="line"><a name="l10483"></a><span class="lineno">10483</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10484"></a><span class="lineno">10484</span>  lastOffset = freeSpace1stTo2ndEnd;</div> -<div class="line"><a name="l10485"></a><span class="lineno">10485</span>  }</div> -<div class="line"><a name="l10486"></a><span class="lineno">10486</span>  }</div> -<div class="line"><a name="l10487"></a><span class="lineno">10487</span>  </div> -<div class="line"><a name="l10488"></a><span class="lineno">10488</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l10489"></a><span class="lineno">10489</span>  {</div> -<div class="line"><a name="l10490"></a><span class="lineno">10490</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> -<div class="line"><a name="l10491"></a><span class="lineno">10491</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> -<div class="line"><a name="l10492"></a><span class="lineno">10492</span>  {</div> -<div class="line"><a name="l10493"></a><span class="lineno">10493</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> -<div class="line"><a name="l10494"></a><span class="lineno">10494</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> -<div class="line"><a name="l10495"></a><span class="lineno">10495</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10496"></a><span class="lineno">10496</span>  {</div> -<div class="line"><a name="l10497"></a><span class="lineno">10497</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10498"></a><span class="lineno">10498</span>  }</div> -<div class="line"><a name="l10499"></a><span class="lineno">10499</span>  </div> -<div class="line"><a name="l10500"></a><span class="lineno">10500</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10501"></a><span class="lineno">10501</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> -<div class="line"><a name="l10502"></a><span class="lineno">10502</span>  {</div> -<div class="line"><a name="l10503"></a><span class="lineno">10503</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10504"></a><span class="lineno">10504</span>  </div> -<div class="line"><a name="l10505"></a><span class="lineno">10505</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10506"></a><span class="lineno">10506</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10507"></a><span class="lineno">10507</span>  {</div> -<div class="line"><a name="l10508"></a><span class="lineno">10508</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10509"></a><span class="lineno">10509</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10510"></a><span class="lineno">10510</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10511"></a><span class="lineno">10511</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10512"></a><span class="lineno">10512</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10513"></a><span class="lineno">10513</span>  }</div> -<div class="line"><a name="l10514"></a><span class="lineno">10514</span>  </div> -<div class="line"><a name="l10515"></a><span class="lineno">10515</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10516"></a><span class="lineno">10516</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10517"></a><span class="lineno">10517</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> -<div class="line"><a name="l10518"></a><span class="lineno">10518</span>  </div> -<div class="line"><a name="l10519"></a><span class="lineno">10519</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10520"></a><span class="lineno">10520</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10521"></a><span class="lineno">10521</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10522"></a><span class="lineno">10522</span>  }</div> -<div class="line"><a name="l10523"></a><span class="lineno">10523</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10524"></a><span class="lineno">10524</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10525"></a><span class="lineno">10525</span>  {</div> -<div class="line"><a name="l10526"></a><span class="lineno">10526</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> -<div class="line"><a name="l10527"></a><span class="lineno">10527</span>  {</div> -<div class="line"><a name="l10528"></a><span class="lineno">10528</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> -<div class="line"><a name="l10529"></a><span class="lineno">10529</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> -<div class="line"><a name="l10530"></a><span class="lineno">10530</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> -<div class="line"><a name="l10531"></a><span class="lineno">10531</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l10532"></a><span class="lineno">10532</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l10533"></a><span class="lineno">10533</span>  }</div> -<div class="line"><a name="l10534"></a><span class="lineno">10534</span>  </div> -<div class="line"><a name="l10535"></a><span class="lineno">10535</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10536"></a><span class="lineno">10536</span>  lastOffset = size;</div> -<div class="line"><a name="l10537"></a><span class="lineno">10537</span>  }</div> -<div class="line"><a name="l10538"></a><span class="lineno">10538</span>  }</div> -<div class="line"><a name="l10539"></a><span class="lineno">10539</span>  }</div> -<div class="line"><a name="l10540"></a><span class="lineno">10540</span> }</div> -<div class="line"><a name="l10541"></a><span class="lineno">10541</span>  </div> -<div class="line"><a name="l10542"></a><span class="lineno">10542</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l10543"></a><span class="lineno">10543</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> -<div class="line"><a name="l10544"></a><span class="lineno">10544</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l10545"></a><span class="lineno">10545</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l10546"></a><span class="lineno">10546</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l10547"></a><span class="lineno">10547</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10548"></a><span class="lineno">10548</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> -<div class="line"><a name="l10549"></a><span class="lineno">10549</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> -<div class="line"><a name="l10550"></a><span class="lineno">10550</span>  </div> -<div class="line"><a name="l10551"></a><span class="lineno">10551</span>  <span class="comment">// FIRST PASS</span></div> -<div class="line"><a name="l10552"></a><span class="lineno">10552</span>  </div> -<div class="line"><a name="l10553"></a><span class="lineno">10553</span>  <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div> -<div class="line"><a name="l10554"></a><span class="lineno">10554</span>  VkDeviceSize usedBytes = 0;</div> -<div class="line"><a name="l10555"></a><span class="lineno">10555</span>  </div> -<div class="line"><a name="l10556"></a><span class="lineno">10556</span>  VkDeviceSize lastOffset = 0;</div> -<div class="line"><a name="l10557"></a><span class="lineno">10557</span>  </div> -<div class="line"><a name="l10558"></a><span class="lineno">10558</span>  <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div> +<div class="line"><a name="l10382"></a><span class="lineno">10382</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> +<div class="line"><a name="l10383"></a><span class="lineno">10383</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> +<div class="line"><a name="l10384"></a><span class="lineno">10384</span>  </div> +<div class="line"><a name="l10385"></a><span class="lineno">10385</span>  <span class="keywordflow">if</span>(!currFree)</div> +<div class="line"><a name="l10386"></a><span class="lineno">10386</span>  {</div> +<div class="line"><a name="l10387"></a><span class="lineno">10387</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> +<div class="line"><a name="l10388"></a><span class="lineno">10388</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> +<div class="line"><a name="l10389"></a><span class="lineno">10389</span>  sumUsedSize += suballoc.size;</div> +<div class="line"><a name="l10390"></a><span class="lineno">10390</span>  }</div> +<div class="line"><a name="l10391"></a><span class="lineno">10391</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10392"></a><span class="lineno">10392</span>  {</div> +<div class="line"><a name="l10393"></a><span class="lineno">10393</span>  ++nullItem2ndCount;</div> +<div class="line"><a name="l10394"></a><span class="lineno">10394</span>  }</div> +<div class="line"><a name="l10395"></a><span class="lineno">10395</span>  </div> +<div class="line"><a name="l10396"></a><span class="lineno">10396</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10397"></a><span class="lineno">10397</span>  }</div> +<div class="line"><a name="l10398"></a><span class="lineno">10398</span>  </div> +<div class="line"><a name="l10399"></a><span class="lineno">10399</span>  VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div> +<div class="line"><a name="l10400"></a><span class="lineno">10400</span>  }</div> +<div class="line"><a name="l10401"></a><span class="lineno">10401</span>  </div> +<div class="line"><a name="l10402"></a><span class="lineno">10402</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_1stNullItemsBeginCount; ++i)</div> +<div class="line"><a name="l10403"></a><span class="lineno">10403</span>  {</div> +<div class="line"><a name="l10404"></a><span class="lineno">10404</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> +<div class="line"><a name="l10405"></a><span class="lineno">10405</span>  VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &&</div> +<div class="line"><a name="l10406"></a><span class="lineno">10406</span>  suballoc.hAllocation == VK_NULL_HANDLE);</div> +<div class="line"><a name="l10407"></a><span class="lineno">10407</span>  }</div> +<div class="line"><a name="l10408"></a><span class="lineno">10408</span>  </div> +<div class="line"><a name="l10409"></a><span class="lineno">10409</span>  <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l10410"></a><span class="lineno">10410</span>  </div> +<div class="line"><a name="l10411"></a><span class="lineno">10411</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i < suballoc1stCount; ++i)</div> +<div class="line"><a name="l10412"></a><span class="lineno">10412</span>  {</div> +<div class="line"><a name="l10413"></a><span class="lineno">10413</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> +<div class="line"><a name="l10414"></a><span class="lineno">10414</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10415"></a><span class="lineno">10415</span>  </div> +<div class="line"><a name="l10416"></a><span class="lineno">10416</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> +<div class="line"><a name="l10417"></a><span class="lineno">10417</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> +<div class="line"><a name="l10418"></a><span class="lineno">10418</span>  VMA_VALIDATE(i >= m_1stNullItemsBeginCount || currFree);</div> +<div class="line"><a name="l10419"></a><span class="lineno">10419</span>  </div> +<div class="line"><a name="l10420"></a><span class="lineno">10420</span>  <span class="keywordflow">if</span>(!currFree)</div> +<div class="line"><a name="l10421"></a><span class="lineno">10421</span>  {</div> +<div class="line"><a name="l10422"></a><span class="lineno">10422</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> +<div class="line"><a name="l10423"></a><span class="lineno">10423</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> +<div class="line"><a name="l10424"></a><span class="lineno">10424</span>  sumUsedSize += suballoc.size;</div> +<div class="line"><a name="l10425"></a><span class="lineno">10425</span>  }</div> +<div class="line"><a name="l10426"></a><span class="lineno">10426</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10427"></a><span class="lineno">10427</span>  {</div> +<div class="line"><a name="l10428"></a><span class="lineno">10428</span>  ++nullItem1stCount;</div> +<div class="line"><a name="l10429"></a><span class="lineno">10429</span>  }</div> +<div class="line"><a name="l10430"></a><span class="lineno">10430</span>  </div> +<div class="line"><a name="l10431"></a><span class="lineno">10431</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10432"></a><span class="lineno">10432</span>  }</div> +<div class="line"><a name="l10433"></a><span class="lineno">10433</span>  VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div> +<div class="line"><a name="l10434"></a><span class="lineno">10434</span>  </div> +<div class="line"><a name="l10435"></a><span class="lineno">10435</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l10436"></a><span class="lineno">10436</span>  {</div> +<div class="line"><a name="l10437"></a><span class="lineno">10437</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> +<div class="line"><a name="l10438"></a><span class="lineno">10438</span>  <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div> +<div class="line"><a name="l10439"></a><span class="lineno">10439</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div> +<div class="line"><a name="l10440"></a><span class="lineno">10440</span>  {</div> +<div class="line"><a name="l10441"></a><span class="lineno">10441</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> +<div class="line"><a name="l10442"></a><span class="lineno">10442</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l10443"></a><span class="lineno">10443</span>  </div> +<div class="line"><a name="l10444"></a><span class="lineno">10444</span>  VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div> +<div class="line"><a name="l10445"></a><span class="lineno">10445</span>  VMA_VALIDATE(suballoc.offset >= offset);</div> +<div class="line"><a name="l10446"></a><span class="lineno">10446</span>  </div> +<div class="line"><a name="l10447"></a><span class="lineno">10447</span>  <span class="keywordflow">if</span>(!currFree)</div> +<div class="line"><a name="l10448"></a><span class="lineno">10448</span>  {</div> +<div class="line"><a name="l10449"></a><span class="lineno">10449</span>  VMA_VALIDATE(suballoc.hAllocation->GetOffset() == suballoc.offset);</div> +<div class="line"><a name="l10450"></a><span class="lineno">10450</span>  VMA_VALIDATE(suballoc.hAllocation->GetSize() == suballoc.size);</div> +<div class="line"><a name="l10451"></a><span class="lineno">10451</span>  sumUsedSize += suballoc.size;</div> +<div class="line"><a name="l10452"></a><span class="lineno">10452</span>  }</div> +<div class="line"><a name="l10453"></a><span class="lineno">10453</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10454"></a><span class="lineno">10454</span>  {</div> +<div class="line"><a name="l10455"></a><span class="lineno">10455</span>  ++nullItem2ndCount;</div> +<div class="line"><a name="l10456"></a><span class="lineno">10456</span>  }</div> +<div class="line"><a name="l10457"></a><span class="lineno">10457</span>  </div> +<div class="line"><a name="l10458"></a><span class="lineno">10458</span>  offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l10459"></a><span class="lineno">10459</span>  }</div> +<div class="line"><a name="l10460"></a><span class="lineno">10460</span>  </div> +<div class="line"><a name="l10461"></a><span class="lineno">10461</span>  VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div> +<div class="line"><a name="l10462"></a><span class="lineno">10462</span>  }</div> +<div class="line"><a name="l10463"></a><span class="lineno">10463</span>  </div> +<div class="line"><a name="l10464"></a><span class="lineno">10464</span>  VMA_VALIDATE(offset <= GetSize());</div> +<div class="line"><a name="l10465"></a><span class="lineno">10465</span>  VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div> +<div class="line"><a name="l10466"></a><span class="lineno">10466</span>  </div> +<div class="line"><a name="l10467"></a><span class="lineno">10467</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l10468"></a><span class="lineno">10468</span> }</div> +<div class="line"><a name="l10469"></a><span class="lineno">10469</span>  </div> +<div class="line"><a name="l10470"></a><span class="lineno">10470</span> <span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div> +<div class="line"><a name="l10471"></a><span class="lineno">10471</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10472"></a><span class="lineno">10472</span>  <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div> +<div class="line"><a name="l10473"></a><span class="lineno">10473</span>  AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div> +<div class="line"><a name="l10474"></a><span class="lineno">10474</span> }</div> +<div class="line"><a name="l10475"></a><span class="lineno">10475</span>  </div> +<div class="line"><a name="l10476"></a><span class="lineno">10476</span> VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> +<div class="line"><a name="l10477"></a><span class="lineno">10477</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10478"></a><span class="lineno">10478</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l10479"></a><span class="lineno">10479</span>  </div> +<div class="line"><a name="l10480"></a><span class="lineno">10480</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l10481"></a><span class="lineno">10481</span> <span class="comment"> We don't consider gaps inside allocation vectors with freed allocations because</span></div> +<div class="line"><a name="l10482"></a><span class="lineno">10482</span> <span class="comment"> they are not suitable for reuse in linear allocator. We consider only space that</span></div> +<div class="line"><a name="l10483"></a><span class="lineno">10483</span> <span class="comment"> is available for new allocations.</span></div> +<div class="line"><a name="l10484"></a><span class="lineno">10484</span> <span class="comment"> */</span></div> +<div class="line"><a name="l10485"></a><span class="lineno">10485</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l10486"></a><span class="lineno">10486</span>  {</div> +<div class="line"><a name="l10487"></a><span class="lineno">10487</span>  <span class="keywordflow">return</span> size;</div> +<div class="line"><a name="l10488"></a><span class="lineno">10488</span>  }</div> +<div class="line"><a name="l10489"></a><span class="lineno">10489</span>  </div> +<div class="line"><a name="l10490"></a><span class="lineno">10490</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l10491"></a><span class="lineno">10491</span>  </div> +<div class="line"><a name="l10492"></a><span class="lineno">10492</span>  <span class="keywordflow">switch</span>(m_2ndVectorMode)</div> +<div class="line"><a name="l10493"></a><span class="lineno">10493</span>  {</div> +<div class="line"><a name="l10494"></a><span class="lineno">10494</span>  <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div> +<div class="line"><a name="l10495"></a><span class="lineno">10495</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l10496"></a><span class="lineno">10496</span> <span class="comment"> Available space is after end of 1st, as well as before beginning of 1st (which</span></div> +<div class="line"><a name="l10497"></a><span class="lineno">10497</span> <span class="comment"> would make it a ring buffer).</span></div> +<div class="line"><a name="l10498"></a><span class="lineno">10498</span> <span class="comment"> */</span></div> +<div class="line"><a name="l10499"></a><span class="lineno">10499</span>  {</div> +<div class="line"><a name="l10500"></a><span class="lineno">10500</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div> +<div class="line"><a name="l10501"></a><span class="lineno">10501</span>  VMA_ASSERT(suballocations1stCount > m_1stNullItemsBeginCount);</div> +<div class="line"><a name="l10502"></a><span class="lineno">10502</span>  <span class="keyword">const</span> VmaSuballocation& firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div> +<div class="line"><a name="l10503"></a><span class="lineno">10503</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations1st[suballocations1stCount - 1];</div> +<div class="line"><a name="l10504"></a><span class="lineno">10504</span>  <span class="keywordflow">return</span> VMA_MAX(</div> +<div class="line"><a name="l10505"></a><span class="lineno">10505</span>  firstSuballoc.offset,</div> +<div class="line"><a name="l10506"></a><span class="lineno">10506</span>  size - (lastSuballoc.offset + lastSuballoc.size));</div> +<div class="line"><a name="l10507"></a><span class="lineno">10507</span>  }</div> +<div class="line"><a name="l10508"></a><span class="lineno">10508</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10509"></a><span class="lineno">10509</span>  </div> +<div class="line"><a name="l10510"></a><span class="lineno">10510</span>  <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div> +<div class="line"><a name="l10511"></a><span class="lineno">10511</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l10512"></a><span class="lineno">10512</span> <span class="comment"> Available space is only between end of 2nd and beginning of 1st.</span></div> +<div class="line"><a name="l10513"></a><span class="lineno">10513</span> <span class="comment"> */</span></div> +<div class="line"><a name="l10514"></a><span class="lineno">10514</span>  {</div> +<div class="line"><a name="l10515"></a><span class="lineno">10515</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10516"></a><span class="lineno">10516</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc2nd = suballocations2nd.back();</div> +<div class="line"><a name="l10517"></a><span class="lineno">10517</span>  <span class="keyword">const</span> VmaSuballocation& firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div> +<div class="line"><a name="l10518"></a><span class="lineno">10518</span>  <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div> +<div class="line"><a name="l10519"></a><span class="lineno">10519</span>  }</div> +<div class="line"><a name="l10520"></a><span class="lineno">10520</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10521"></a><span class="lineno">10521</span>  </div> +<div class="line"><a name="l10522"></a><span class="lineno">10522</span>  <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div> +<div class="line"><a name="l10523"></a><span class="lineno">10523</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l10524"></a><span class="lineno">10524</span> <span class="comment"> Available space is only between end of 1st and top of 2nd.</span></div> +<div class="line"><a name="l10525"></a><span class="lineno">10525</span> <span class="comment"> */</span></div> +<div class="line"><a name="l10526"></a><span class="lineno">10526</span>  {</div> +<div class="line"><a name="l10527"></a><span class="lineno">10527</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10528"></a><span class="lineno">10528</span>  <span class="keyword">const</span> VmaSuballocation& topSuballoc2nd = suballocations2nd.back();</div> +<div class="line"><a name="l10529"></a><span class="lineno">10529</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc1st = suballocations1st.back();</div> +<div class="line"><a name="l10530"></a><span class="lineno">10530</span>  <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</div> +<div class="line"><a name="l10531"></a><span class="lineno">10531</span>  }</div> +<div class="line"><a name="l10532"></a><span class="lineno">10532</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l10533"></a><span class="lineno">10533</span>  </div> +<div class="line"><a name="l10534"></a><span class="lineno">10534</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l10535"></a><span class="lineno">10535</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l10536"></a><span class="lineno">10536</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l10537"></a><span class="lineno">10537</span>  }</div> +<div class="line"><a name="l10538"></a><span class="lineno">10538</span> }</div> +<div class="line"><a name="l10539"></a><span class="lineno">10539</span>  </div> +<div class="line"><a name="l10540"></a><span class="lineno">10540</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> +<div class="line"><a name="l10541"></a><span class="lineno">10541</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10542"></a><span class="lineno">10542</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l10543"></a><span class="lineno">10543</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l10544"></a><span class="lineno">10544</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10545"></a><span class="lineno">10545</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> +<div class="line"><a name="l10546"></a><span class="lineno">10546</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> +<div class="line"><a name="l10547"></a><span class="lineno">10547</span>  </div> +<div class="line"><a name="l10548"></a><span class="lineno">10548</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> +<div class="line"><a name="l10549"></a><span class="lineno">10549</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div> +<div class="line"><a name="l10550"></a><span class="lineno">10550</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> +<div class="line"><a name="l10551"></a><span class="lineno">10551</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div> +<div class="line"><a name="l10552"></a><span class="lineno">10552</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l10553"></a><span class="lineno">10553</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div> +<div class="line"><a name="l10554"></a><span class="lineno">10554</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l10555"></a><span class="lineno">10555</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> +<div class="line"><a name="l10556"></a><span class="lineno">10556</span>  </div> +<div class="line"><a name="l10557"></a><span class="lineno">10557</span>  VkDeviceSize lastOffset = 0;</div> +<div class="line"><a name="l10558"></a><span class="lineno">10558</span>  </div> <div class="line"><a name="l10559"></a><span class="lineno">10559</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> <div class="line"><a name="l10560"></a><span class="lineno">10560</span>  {</div> <div class="line"><a name="l10561"></a><span class="lineno">10561</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> <div class="line"><a name="l10562"></a><span class="lineno">10562</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div> <div class="line"><a name="l10563"></a><span class="lineno">10563</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> <div class="line"><a name="l10564"></a><span class="lineno">10564</span>  {</div> -<div class="line"><a name="l10565"></a><span class="lineno">10565</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l10565"></a><span class="lineno">10565</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> <div class="line"><a name="l10566"></a><span class="lineno">10566</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> <div class="line"><a name="l10567"></a><span class="lineno">10567</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> <div class="line"><a name="l10568"></a><span class="lineno">10568</span>  {</div> @@ -7404,8872 +7339,9295 @@ <div class="line"><a name="l10573"></a><span class="lineno">10573</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> <div class="line"><a name="l10574"></a><span class="lineno">10574</span>  {</div> <div class="line"><a name="l10575"></a><span class="lineno">10575</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10576"></a><span class="lineno">10576</span>  </div> +<div class="line"><a name="l10576"></a><span class="lineno">10576</span>  </div> <div class="line"><a name="l10577"></a><span class="lineno">10577</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> <div class="line"><a name="l10578"></a><span class="lineno">10578</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> <div class="line"><a name="l10579"></a><span class="lineno">10579</span>  {</div> <div class="line"><a name="l10580"></a><span class="lineno">10580</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10581"></a><span class="lineno">10581</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10582"></a><span class="lineno">10582</span>  }</div> -<div class="line"><a name="l10583"></a><span class="lineno">10583</span>  </div> -<div class="line"><a name="l10584"></a><span class="lineno">10584</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10585"></a><span class="lineno">10585</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10586"></a><span class="lineno">10586</span>  ++alloc2ndCount;</div> -<div class="line"><a name="l10587"></a><span class="lineno">10587</span>  usedBytes += suballoc.size;</div> -<div class="line"><a name="l10588"></a><span class="lineno">10588</span>  </div> -<div class="line"><a name="l10589"></a><span class="lineno">10589</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10590"></a><span class="lineno">10590</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10591"></a><span class="lineno">10591</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10592"></a><span class="lineno">10592</span>  }</div> -<div class="line"><a name="l10593"></a><span class="lineno">10593</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10594"></a><span class="lineno">10594</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10595"></a><span class="lineno">10595</span>  {</div> -<div class="line"><a name="l10596"></a><span class="lineno">10596</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10597"></a><span class="lineno">10597</span>  {</div> -<div class="line"><a name="l10598"></a><span class="lineno">10598</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> -<div class="line"><a name="l10599"></a><span class="lineno">10599</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10600"></a><span class="lineno">10600</span>  }</div> -<div class="line"><a name="l10601"></a><span class="lineno">10601</span>  </div> -<div class="line"><a name="l10602"></a><span class="lineno">10602</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10603"></a><span class="lineno">10603</span>  lastOffset = freeSpace2ndTo1stEnd;</div> -<div class="line"><a name="l10604"></a><span class="lineno">10604</span>  }</div> -<div class="line"><a name="l10605"></a><span class="lineno">10605</span>  }</div> -<div class="line"><a name="l10606"></a><span class="lineno">10606</span>  }</div> -<div class="line"><a name="l10607"></a><span class="lineno">10607</span>  </div> -<div class="line"><a name="l10608"></a><span class="lineno">10608</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10609"></a><span class="lineno">10609</span>  <span class="keywordtype">size_t</span> alloc1stCount = 0;</div> -<div class="line"><a name="l10610"></a><span class="lineno">10610</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> -<div class="line"><a name="l10611"></a><span class="lineno">10611</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> -<div class="line"><a name="l10612"></a><span class="lineno">10612</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10613"></a><span class="lineno">10613</span>  {</div> -<div class="line"><a name="l10614"></a><span class="lineno">10614</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10615"></a><span class="lineno">10615</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> -<div class="line"><a name="l10616"></a><span class="lineno">10616</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10617"></a><span class="lineno">10617</span>  {</div> -<div class="line"><a name="l10618"></a><span class="lineno">10618</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10619"></a><span class="lineno">10619</span>  }</div> -<div class="line"><a name="l10620"></a><span class="lineno">10620</span>  </div> -<div class="line"><a name="l10621"></a><span class="lineno">10621</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10622"></a><span class="lineno">10622</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> -<div class="line"><a name="l10623"></a><span class="lineno">10623</span>  {</div> -<div class="line"><a name="l10624"></a><span class="lineno">10624</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> -<div class="line"><a name="l10625"></a><span class="lineno">10625</span>  </div> -<div class="line"><a name="l10626"></a><span class="lineno">10626</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10627"></a><span class="lineno">10627</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10628"></a><span class="lineno">10628</span>  {</div> -<div class="line"><a name="l10629"></a><span class="lineno">10629</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10630"></a><span class="lineno">10630</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10631"></a><span class="lineno">10631</span>  }</div> -<div class="line"><a name="l10632"></a><span class="lineno">10632</span>  </div> -<div class="line"><a name="l10633"></a><span class="lineno">10633</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10634"></a><span class="lineno">10634</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10635"></a><span class="lineno">10635</span>  ++alloc1stCount;</div> -<div class="line"><a name="l10636"></a><span class="lineno">10636</span>  usedBytes += suballoc.size;</div> -<div class="line"><a name="l10637"></a><span class="lineno">10637</span>  </div> -<div class="line"><a name="l10638"></a><span class="lineno">10638</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10639"></a><span class="lineno">10639</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10640"></a><span class="lineno">10640</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10641"></a><span class="lineno">10641</span>  }</div> -<div class="line"><a name="l10642"></a><span class="lineno">10642</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10643"></a><span class="lineno">10643</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10644"></a><span class="lineno">10644</span>  {</div> -<div class="line"><a name="l10645"></a><span class="lineno">10645</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> -<div class="line"><a name="l10646"></a><span class="lineno">10646</span>  {</div> -<div class="line"><a name="l10647"></a><span class="lineno">10647</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> -<div class="line"><a name="l10648"></a><span class="lineno">10648</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10649"></a><span class="lineno">10649</span>  }</div> +<div class="line"><a name="l10581"></a><span class="lineno">10581</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10582"></a><span class="lineno">10582</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10583"></a><span class="lineno">10583</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10584"></a><span class="lineno">10584</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10585"></a><span class="lineno">10585</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10586"></a><span class="lineno">10586</span>  }</div> +<div class="line"><a name="l10587"></a><span class="lineno">10587</span>  </div> +<div class="line"><a name="l10588"></a><span class="lineno">10588</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10589"></a><span class="lineno">10589</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10590"></a><span class="lineno">10590</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> +<div class="line"><a name="l10591"></a><span class="lineno">10591</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> +<div class="line"><a name="l10592"></a><span class="lineno">10592</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> +<div class="line"><a name="l10593"></a><span class="lineno">10593</span>  </div> +<div class="line"><a name="l10594"></a><span class="lineno">10594</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10595"></a><span class="lineno">10595</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10596"></a><span class="lineno">10596</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l10597"></a><span class="lineno">10597</span>  }</div> +<div class="line"><a name="l10598"></a><span class="lineno">10598</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10599"></a><span class="lineno">10599</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10600"></a><span class="lineno">10600</span>  {</div> +<div class="line"><a name="l10601"></a><span class="lineno">10601</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> +<div class="line"><a name="l10602"></a><span class="lineno">10602</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l10603"></a><span class="lineno">10603</span>  {</div> +<div class="line"><a name="l10604"></a><span class="lineno">10604</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> +<div class="line"><a name="l10605"></a><span class="lineno">10605</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10606"></a><span class="lineno">10606</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10607"></a><span class="lineno">10607</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10608"></a><span class="lineno">10608</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10609"></a><span class="lineno">10609</span>  }</div> +<div class="line"><a name="l10610"></a><span class="lineno">10610</span>  </div> +<div class="line"><a name="l10611"></a><span class="lineno">10611</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10612"></a><span class="lineno">10612</span>  lastOffset = freeSpace2ndTo1stEnd;</div> +<div class="line"><a name="l10613"></a><span class="lineno">10613</span>  }</div> +<div class="line"><a name="l10614"></a><span class="lineno">10614</span>  }</div> +<div class="line"><a name="l10615"></a><span class="lineno">10615</span>  }</div> +<div class="line"><a name="l10616"></a><span class="lineno">10616</span>  </div> +<div class="line"><a name="l10617"></a><span class="lineno">10617</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l10618"></a><span class="lineno">10618</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> +<div class="line"><a name="l10619"></a><span class="lineno">10619</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> +<div class="line"><a name="l10620"></a><span class="lineno">10620</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l10621"></a><span class="lineno">10621</span>  {</div> +<div class="line"><a name="l10622"></a><span class="lineno">10622</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> +<div class="line"><a name="l10623"></a><span class="lineno">10623</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> +<div class="line"><a name="l10624"></a><span class="lineno">10624</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10625"></a><span class="lineno">10625</span>  {</div> +<div class="line"><a name="l10626"></a><span class="lineno">10626</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l10627"></a><span class="lineno">10627</span>  }</div> +<div class="line"><a name="l10628"></a><span class="lineno">10628</span>  </div> +<div class="line"><a name="l10629"></a><span class="lineno">10629</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10630"></a><span class="lineno">10630</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> +<div class="line"><a name="l10631"></a><span class="lineno">10631</span>  {</div> +<div class="line"><a name="l10632"></a><span class="lineno">10632</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> +<div class="line"><a name="l10633"></a><span class="lineno">10633</span>  </div> +<div class="line"><a name="l10634"></a><span class="lineno">10634</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10635"></a><span class="lineno">10635</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10636"></a><span class="lineno">10636</span>  {</div> +<div class="line"><a name="l10637"></a><span class="lineno">10637</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10638"></a><span class="lineno">10638</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10639"></a><span class="lineno">10639</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10640"></a><span class="lineno">10640</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10641"></a><span class="lineno">10641</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10642"></a><span class="lineno">10642</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10643"></a><span class="lineno">10643</span>  }</div> +<div class="line"><a name="l10644"></a><span class="lineno">10644</span>  </div> +<div class="line"><a name="l10645"></a><span class="lineno">10645</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10646"></a><span class="lineno">10646</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10647"></a><span class="lineno">10647</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> +<div class="line"><a name="l10648"></a><span class="lineno">10648</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> +<div class="line"><a name="l10649"></a><span class="lineno">10649</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> <div class="line"><a name="l10650"></a><span class="lineno">10650</span>  </div> -<div class="line"><a name="l10651"></a><span class="lineno">10651</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10652"></a><span class="lineno">10652</span>  lastOffset = freeSpace1stTo2ndEnd;</div> -<div class="line"><a name="l10653"></a><span class="lineno">10653</span>  }</div> -<div class="line"><a name="l10654"></a><span class="lineno">10654</span>  }</div> -<div class="line"><a name="l10655"></a><span class="lineno">10655</span>  </div> -<div class="line"><a name="l10656"></a><span class="lineno">10656</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l10657"></a><span class="lineno">10657</span>  {</div> -<div class="line"><a name="l10658"></a><span class="lineno">10658</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> -<div class="line"><a name="l10659"></a><span class="lineno">10659</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> -<div class="line"><a name="l10660"></a><span class="lineno">10660</span>  {</div> -<div class="line"><a name="l10661"></a><span class="lineno">10661</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> -<div class="line"><a name="l10662"></a><span class="lineno">10662</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> -<div class="line"><a name="l10663"></a><span class="lineno">10663</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10664"></a><span class="lineno">10664</span>  {</div> -<div class="line"><a name="l10665"></a><span class="lineno">10665</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10666"></a><span class="lineno">10666</span>  }</div> +<div class="line"><a name="l10651"></a><span class="lineno">10651</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10652"></a><span class="lineno">10652</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10653"></a><span class="lineno">10653</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l10654"></a><span class="lineno">10654</span>  }</div> +<div class="line"><a name="l10655"></a><span class="lineno">10655</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10656"></a><span class="lineno">10656</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10657"></a><span class="lineno">10657</span>  {</div> +<div class="line"><a name="l10658"></a><span class="lineno">10658</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> +<div class="line"><a name="l10659"></a><span class="lineno">10659</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l10660"></a><span class="lineno">10660</span>  {</div> +<div class="line"><a name="l10661"></a><span class="lineno">10661</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> +<div class="line"><a name="l10662"></a><span class="lineno">10662</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10663"></a><span class="lineno">10663</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10664"></a><span class="lineno">10664</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10665"></a><span class="lineno">10665</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10666"></a><span class="lineno">10666</span>  }</div> <div class="line"><a name="l10667"></a><span class="lineno">10667</span>  </div> -<div class="line"><a name="l10668"></a><span class="lineno">10668</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10669"></a><span class="lineno">10669</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> -<div class="line"><a name="l10670"></a><span class="lineno">10670</span>  {</div> -<div class="line"><a name="l10671"></a><span class="lineno">10671</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10672"></a><span class="lineno">10672</span>  </div> -<div class="line"><a name="l10673"></a><span class="lineno">10673</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10674"></a><span class="lineno">10674</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10675"></a><span class="lineno">10675</span>  {</div> -<div class="line"><a name="l10676"></a><span class="lineno">10676</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10677"></a><span class="lineno">10677</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10678"></a><span class="lineno">10678</span>  }</div> -<div class="line"><a name="l10679"></a><span class="lineno">10679</span>  </div> -<div class="line"><a name="l10680"></a><span class="lineno">10680</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10681"></a><span class="lineno">10681</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10682"></a><span class="lineno">10682</span>  ++alloc2ndCount;</div> -<div class="line"><a name="l10683"></a><span class="lineno">10683</span>  usedBytes += suballoc.size;</div> -<div class="line"><a name="l10684"></a><span class="lineno">10684</span>  </div> -<div class="line"><a name="l10685"></a><span class="lineno">10685</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10686"></a><span class="lineno">10686</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10687"></a><span class="lineno">10687</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10688"></a><span class="lineno">10688</span>  }</div> -<div class="line"><a name="l10689"></a><span class="lineno">10689</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10690"></a><span class="lineno">10690</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10691"></a><span class="lineno">10691</span>  {</div> -<div class="line"><a name="l10692"></a><span class="lineno">10692</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> -<div class="line"><a name="l10693"></a><span class="lineno">10693</span>  {</div> -<div class="line"><a name="l10694"></a><span class="lineno">10694</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> -<div class="line"><a name="l10695"></a><span class="lineno">10695</span>  ++unusedRangeCount;</div> -<div class="line"><a name="l10696"></a><span class="lineno">10696</span>  }</div> -<div class="line"><a name="l10697"></a><span class="lineno">10697</span>  </div> -<div class="line"><a name="l10698"></a><span class="lineno">10698</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10699"></a><span class="lineno">10699</span>  lastOffset = size;</div> -<div class="line"><a name="l10700"></a><span class="lineno">10700</span>  }</div> -<div class="line"><a name="l10701"></a><span class="lineno">10701</span>  }</div> -<div class="line"><a name="l10702"></a><span class="lineno">10702</span>  }</div> -<div class="line"><a name="l10703"></a><span class="lineno">10703</span>  </div> -<div class="line"><a name="l10704"></a><span class="lineno">10704</span>  <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div> -<div class="line"><a name="l10705"></a><span class="lineno">10705</span>  PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div> +<div class="line"><a name="l10668"></a><span class="lineno">10668</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10669"></a><span class="lineno">10669</span>  lastOffset = freeSpace1stTo2ndEnd;</div> +<div class="line"><a name="l10670"></a><span class="lineno">10670</span>  }</div> +<div class="line"><a name="l10671"></a><span class="lineno">10671</span>  }</div> +<div class="line"><a name="l10672"></a><span class="lineno">10672</span>  </div> +<div class="line"><a name="l10673"></a><span class="lineno">10673</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l10674"></a><span class="lineno">10674</span>  {</div> +<div class="line"><a name="l10675"></a><span class="lineno">10675</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> +<div class="line"><a name="l10676"></a><span class="lineno">10676</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> +<div class="line"><a name="l10677"></a><span class="lineno">10677</span>  {</div> +<div class="line"><a name="l10678"></a><span class="lineno">10678</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> +<div class="line"><a name="l10679"></a><span class="lineno">10679</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> +<div class="line"><a name="l10680"></a><span class="lineno">10680</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10681"></a><span class="lineno">10681</span>  {</div> +<div class="line"><a name="l10682"></a><span class="lineno">10682</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l10683"></a><span class="lineno">10683</span>  }</div> +<div class="line"><a name="l10684"></a><span class="lineno">10684</span>  </div> +<div class="line"><a name="l10685"></a><span class="lineno">10685</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10686"></a><span class="lineno">10686</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> +<div class="line"><a name="l10687"></a><span class="lineno">10687</span>  {</div> +<div class="line"><a name="l10688"></a><span class="lineno">10688</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l10689"></a><span class="lineno">10689</span>  </div> +<div class="line"><a name="l10690"></a><span class="lineno">10690</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10691"></a><span class="lineno">10691</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10692"></a><span class="lineno">10692</span>  {</div> +<div class="line"><a name="l10693"></a><span class="lineno">10693</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10694"></a><span class="lineno">10694</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10695"></a><span class="lineno">10695</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10696"></a><span class="lineno">10696</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10697"></a><span class="lineno">10697</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10698"></a><span class="lineno">10698</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10699"></a><span class="lineno">10699</span>  }</div> +<div class="line"><a name="l10700"></a><span class="lineno">10700</span>  </div> +<div class="line"><a name="l10701"></a><span class="lineno">10701</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10702"></a><span class="lineno">10702</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10703"></a><span class="lineno">10703</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div> +<div class="line"><a name="l10704"></a><span class="lineno">10704</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div> +<div class="line"><a name="l10705"></a><span class="lineno">10705</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div> <div class="line"><a name="l10706"></a><span class="lineno">10706</span>  </div> -<div class="line"><a name="l10707"></a><span class="lineno">10707</span>  <span class="comment">// SECOND PASS</span></div> -<div class="line"><a name="l10708"></a><span class="lineno">10708</span>  lastOffset = 0;</div> -<div class="line"><a name="l10709"></a><span class="lineno">10709</span>  </div> -<div class="line"><a name="l10710"></a><span class="lineno">10710</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l10711"></a><span class="lineno">10711</span>  {</div> -<div class="line"><a name="l10712"></a><span class="lineno">10712</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> -<div class="line"><a name="l10713"></a><span class="lineno">10713</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div> -<div class="line"><a name="l10714"></a><span class="lineno">10714</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10715"></a><span class="lineno">10715</span>  {</div> -<div class="line"><a name="l10716"></a><span class="lineno">10716</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> -<div class="line"><a name="l10717"></a><span class="lineno">10717</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> -<div class="line"><a name="l10718"></a><span class="lineno">10718</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10719"></a><span class="lineno">10719</span>  {</div> -<div class="line"><a name="l10720"></a><span class="lineno">10720</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10721"></a><span class="lineno">10721</span>  }</div> -<div class="line"><a name="l10722"></a><span class="lineno">10722</span>  </div> -<div class="line"><a name="l10723"></a><span class="lineno">10723</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10724"></a><span class="lineno">10724</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> -<div class="line"><a name="l10725"></a><span class="lineno">10725</span>  {</div> -<div class="line"><a name="l10726"></a><span class="lineno">10726</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10727"></a><span class="lineno">10727</span>  </div> -<div class="line"><a name="l10728"></a><span class="lineno">10728</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10729"></a><span class="lineno">10729</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10730"></a><span class="lineno">10730</span>  {</div> -<div class="line"><a name="l10731"></a><span class="lineno">10731</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10732"></a><span class="lineno">10732</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10733"></a><span class="lineno">10733</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10734"></a><span class="lineno">10734</span>  }</div> -<div class="line"><a name="l10735"></a><span class="lineno">10735</span>  </div> -<div class="line"><a name="l10736"></a><span class="lineno">10736</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10737"></a><span class="lineno">10737</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10738"></a><span class="lineno">10738</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> -<div class="line"><a name="l10739"></a><span class="lineno">10739</span>  </div> -<div class="line"><a name="l10740"></a><span class="lineno">10740</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10741"></a><span class="lineno">10741</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10742"></a><span class="lineno">10742</span>  ++nextAlloc2ndIndex;</div> -<div class="line"><a name="l10743"></a><span class="lineno">10743</span>  }</div> -<div class="line"><a name="l10744"></a><span class="lineno">10744</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10745"></a><span class="lineno">10745</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10746"></a><span class="lineno">10746</span>  {</div> -<div class="line"><a name="l10747"></a><span class="lineno">10747</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> -<div class="line"><a name="l10748"></a><span class="lineno">10748</span>  {</div> -<div class="line"><a name="l10749"></a><span class="lineno">10749</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> -<div class="line"><a name="l10750"></a><span class="lineno">10750</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> -<div class="line"><a name="l10751"></a><span class="lineno">10751</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10752"></a><span class="lineno">10752</span>  }</div> -<div class="line"><a name="l10753"></a><span class="lineno">10753</span>  </div> -<div class="line"><a name="l10754"></a><span class="lineno">10754</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10755"></a><span class="lineno">10755</span>  lastOffset = freeSpace2ndTo1stEnd;</div> +<div class="line"><a name="l10707"></a><span class="lineno">10707</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10708"></a><span class="lineno">10708</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10709"></a><span class="lineno">10709</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l10710"></a><span class="lineno">10710</span>  }</div> +<div class="line"><a name="l10711"></a><span class="lineno">10711</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10712"></a><span class="lineno">10712</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10713"></a><span class="lineno">10713</span>  {</div> +<div class="line"><a name="l10714"></a><span class="lineno">10714</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> +<div class="line"><a name="l10715"></a><span class="lineno">10715</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> +<div class="line"><a name="l10716"></a><span class="lineno">10716</span>  {</div> +<div class="line"><a name="l10717"></a><span class="lineno">10717</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> +<div class="line"><a name="l10718"></a><span class="lineno">10718</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l10719"></a><span class="lineno">10719</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l10720"></a><span class="lineno">10720</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l10721"></a><span class="lineno">10721</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10722"></a><span class="lineno">10722</span>  }</div> +<div class="line"><a name="l10723"></a><span class="lineno">10723</span>  </div> +<div class="line"><a name="l10724"></a><span class="lineno">10724</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10725"></a><span class="lineno">10725</span>  lastOffset = size;</div> +<div class="line"><a name="l10726"></a><span class="lineno">10726</span>  }</div> +<div class="line"><a name="l10727"></a><span class="lineno">10727</span>  }</div> +<div class="line"><a name="l10728"></a><span class="lineno">10728</span>  }</div> +<div class="line"><a name="l10729"></a><span class="lineno">10729</span>  </div> +<div class="line"><a name="l10730"></a><span class="lineno">10730</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> +<div class="line"><a name="l10731"></a><span class="lineno">10731</span> }</div> +<div class="line"><a name="l10732"></a><span class="lineno">10732</span>  </div> +<div class="line"><a name="l10733"></a><span class="lineno">10733</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> +<div class="line"><a name="l10734"></a><span class="lineno">10734</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10735"></a><span class="lineno">10735</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l10736"></a><span class="lineno">10736</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10737"></a><span class="lineno">10737</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l10738"></a><span class="lineno">10738</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> +<div class="line"><a name="l10739"></a><span class="lineno">10739</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> +<div class="line"><a name="l10740"></a><span class="lineno">10740</span>  </div> +<div class="line"><a name="l10741"></a><span class="lineno">10741</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div> +<div class="line"><a name="l10742"></a><span class="lineno">10742</span>  </div> +<div class="line"><a name="l10743"></a><span class="lineno">10743</span>  VkDeviceSize lastOffset = 0;</div> +<div class="line"><a name="l10744"></a><span class="lineno">10744</span>  </div> +<div class="line"><a name="l10745"></a><span class="lineno">10745</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l10746"></a><span class="lineno">10746</span>  {</div> +<div class="line"><a name="l10747"></a><span class="lineno">10747</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> +<div class="line"><a name="l10748"></a><span class="lineno">10748</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l10749"></a><span class="lineno">10749</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l10750"></a><span class="lineno">10750</span>  {</div> +<div class="line"><a name="l10751"></a><span class="lineno">10751</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l10752"></a><span class="lineno">10752</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> +<div class="line"><a name="l10753"></a><span class="lineno">10753</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10754"></a><span class="lineno">10754</span>  {</div> +<div class="line"><a name="l10755"></a><span class="lineno">10755</span>  ++nextAlloc2ndIndex;</div> <div class="line"><a name="l10756"></a><span class="lineno">10756</span>  }</div> -<div class="line"><a name="l10757"></a><span class="lineno">10757</span>  }</div> -<div class="line"><a name="l10758"></a><span class="lineno">10758</span>  }</div> -<div class="line"><a name="l10759"></a><span class="lineno">10759</span>  </div> -<div class="line"><a name="l10760"></a><span class="lineno">10760</span>  nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l10761"></a><span class="lineno">10761</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10762"></a><span class="lineno">10762</span>  {</div> -<div class="line"><a name="l10763"></a><span class="lineno">10763</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> -<div class="line"><a name="l10764"></a><span class="lineno">10764</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> -<div class="line"><a name="l10765"></a><span class="lineno">10765</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10766"></a><span class="lineno">10766</span>  {</div> -<div class="line"><a name="l10767"></a><span class="lineno">10767</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10768"></a><span class="lineno">10768</span>  }</div> -<div class="line"><a name="l10769"></a><span class="lineno">10769</span>  </div> -<div class="line"><a name="l10770"></a><span class="lineno">10770</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10771"></a><span class="lineno">10771</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> -<div class="line"><a name="l10772"></a><span class="lineno">10772</span>  {</div> -<div class="line"><a name="l10773"></a><span class="lineno">10773</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> -<div class="line"><a name="l10774"></a><span class="lineno">10774</span>  </div> -<div class="line"><a name="l10775"></a><span class="lineno">10775</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10776"></a><span class="lineno">10776</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10777"></a><span class="lineno">10777</span>  {</div> -<div class="line"><a name="l10778"></a><span class="lineno">10778</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10779"></a><span class="lineno">10779</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10780"></a><span class="lineno">10780</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10781"></a><span class="lineno">10781</span>  }</div> -<div class="line"><a name="l10782"></a><span class="lineno">10782</span>  </div> -<div class="line"><a name="l10783"></a><span class="lineno">10783</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10784"></a><span class="lineno">10784</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10785"></a><span class="lineno">10785</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> -<div class="line"><a name="l10786"></a><span class="lineno">10786</span>  </div> -<div class="line"><a name="l10787"></a><span class="lineno">10787</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10788"></a><span class="lineno">10788</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10789"></a><span class="lineno">10789</span>  ++nextAlloc1stIndex;</div> -<div class="line"><a name="l10790"></a><span class="lineno">10790</span>  }</div> -<div class="line"><a name="l10791"></a><span class="lineno">10791</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10792"></a><span class="lineno">10792</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10793"></a><span class="lineno">10793</span>  {</div> -<div class="line"><a name="l10794"></a><span class="lineno">10794</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> -<div class="line"><a name="l10795"></a><span class="lineno">10795</span>  {</div> -<div class="line"><a name="l10796"></a><span class="lineno">10796</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> -<div class="line"><a name="l10797"></a><span class="lineno">10797</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> -<div class="line"><a name="l10798"></a><span class="lineno">10798</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10799"></a><span class="lineno">10799</span>  }</div> -<div class="line"><a name="l10800"></a><span class="lineno">10800</span>  </div> -<div class="line"><a name="l10801"></a><span class="lineno">10801</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10802"></a><span class="lineno">10802</span>  lastOffset = freeSpace1stTo2ndEnd;</div> -<div class="line"><a name="l10803"></a><span class="lineno">10803</span>  }</div> -<div class="line"><a name="l10804"></a><span class="lineno">10804</span>  }</div> -<div class="line"><a name="l10805"></a><span class="lineno">10805</span>  </div> -<div class="line"><a name="l10806"></a><span class="lineno">10806</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l10807"></a><span class="lineno">10807</span>  {</div> -<div class="line"><a name="l10808"></a><span class="lineno">10808</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> -<div class="line"><a name="l10809"></a><span class="lineno">10809</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> -<div class="line"><a name="l10810"></a><span class="lineno">10810</span>  {</div> -<div class="line"><a name="l10811"></a><span class="lineno">10811</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> -<div class="line"><a name="l10812"></a><span class="lineno">10812</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> -<div class="line"><a name="l10813"></a><span class="lineno">10813</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l10814"></a><span class="lineno">10814</span>  {</div> -<div class="line"><a name="l10815"></a><span class="lineno">10815</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10816"></a><span class="lineno">10816</span>  }</div> -<div class="line"><a name="l10817"></a><span class="lineno">10817</span>  </div> -<div class="line"><a name="l10818"></a><span class="lineno">10818</span>  <span class="comment">// Found non-null allocation.</span></div> -<div class="line"><a name="l10819"></a><span class="lineno">10819</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> -<div class="line"><a name="l10820"></a><span class="lineno">10820</span>  {</div> -<div class="line"><a name="l10821"></a><span class="lineno">10821</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> -<div class="line"><a name="l10822"></a><span class="lineno">10822</span>  </div> -<div class="line"><a name="l10823"></a><span class="lineno">10823</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> -<div class="line"><a name="l10824"></a><span class="lineno">10824</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> -<div class="line"><a name="l10825"></a><span class="lineno">10825</span>  {</div> -<div class="line"><a name="l10826"></a><span class="lineno">10826</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> -<div class="line"><a name="l10827"></a><span class="lineno">10827</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> -<div class="line"><a name="l10828"></a><span class="lineno">10828</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10829"></a><span class="lineno">10829</span>  }</div> -<div class="line"><a name="l10830"></a><span class="lineno">10830</span>  </div> -<div class="line"><a name="l10831"></a><span class="lineno">10831</span>  <span class="comment">// 2. Process this allocation.</span></div> -<div class="line"><a name="l10832"></a><span class="lineno">10832</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> -<div class="line"><a name="l10833"></a><span class="lineno">10833</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> -<div class="line"><a name="l10834"></a><span class="lineno">10834</span>  </div> -<div class="line"><a name="l10835"></a><span class="lineno">10835</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> -<div class="line"><a name="l10836"></a><span class="lineno">10836</span>  lastOffset = suballoc.offset + suballoc.size;</div> -<div class="line"><a name="l10837"></a><span class="lineno">10837</span>  --nextAlloc2ndIndex;</div> -<div class="line"><a name="l10838"></a><span class="lineno">10838</span>  }</div> -<div class="line"><a name="l10839"></a><span class="lineno">10839</span>  <span class="comment">// We are at the end.</span></div> -<div class="line"><a name="l10840"></a><span class="lineno">10840</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10841"></a><span class="lineno">10841</span>  {</div> -<div class="line"><a name="l10842"></a><span class="lineno">10842</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> -<div class="line"><a name="l10843"></a><span class="lineno">10843</span>  {</div> -<div class="line"><a name="l10844"></a><span class="lineno">10844</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> -<div class="line"><a name="l10845"></a><span class="lineno">10845</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> -<div class="line"><a name="l10846"></a><span class="lineno">10846</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> -<div class="line"><a name="l10847"></a><span class="lineno">10847</span>  }</div> -<div class="line"><a name="l10848"></a><span class="lineno">10848</span>  </div> -<div class="line"><a name="l10849"></a><span class="lineno">10849</span>  <span class="comment">// End of loop.</span></div> -<div class="line"><a name="l10850"></a><span class="lineno">10850</span>  lastOffset = size;</div> -<div class="line"><a name="l10851"></a><span class="lineno">10851</span>  }</div> -<div class="line"><a name="l10852"></a><span class="lineno">10852</span>  }</div> -<div class="line"><a name="l10853"></a><span class="lineno">10853</span>  }</div> -<div class="line"><a name="l10854"></a><span class="lineno">10854</span>  </div> -<div class="line"><a name="l10855"></a><span class="lineno">10855</span>  PrintDetailedMap_End(json);</div> -<div class="line"><a name="l10856"></a><span class="lineno">10856</span> }</div> -<div class="line"><a name="l10857"></a><span class="lineno">10857</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l10858"></a><span class="lineno">10858</span>  </div> -<div class="line"><a name="l10859"></a><span class="lineno">10859</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div> -<div class="line"><a name="l10860"></a><span class="lineno">10860</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l10861"></a><span class="lineno">10861</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l10862"></a><span class="lineno">10862</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l10863"></a><span class="lineno">10863</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l10864"></a><span class="lineno">10864</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l10865"></a><span class="lineno">10865</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l10866"></a><span class="lineno">10866</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l10867"></a><span class="lineno">10867</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l10868"></a><span class="lineno">10868</span>  uint32_t strategy,</div> -<div class="line"><a name="l10869"></a><span class="lineno">10869</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l10870"></a><span class="lineno">10870</span> {</div> -<div class="line"><a name="l10871"></a><span class="lineno">10871</span>  VMA_ASSERT(allocSize > 0);</div> -<div class="line"><a name="l10872"></a><span class="lineno">10872</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> -<div class="line"><a name="l10873"></a><span class="lineno">10873</span>  VMA_ASSERT(pAllocationRequest != VMA_NULL);</div> -<div class="line"><a name="l10874"></a><span class="lineno">10874</span>  VMA_HEAVY_ASSERT(Validate());</div> -<div class="line"><a name="l10875"></a><span class="lineno">10875</span>  <span class="keywordflow">return</span> upperAddress ?</div> -<div class="line"><a name="l10876"></a><span class="lineno">10876</span>  CreateAllocationRequest_UpperAddress(</div> -<div class="line"><a name="l10877"></a><span class="lineno">10877</span>  currentFrameIndex, frameInUseCount, bufferImageGranularity,</div> -<div class="line"><a name="l10878"></a><span class="lineno">10878</span>  allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div> -<div class="line"><a name="l10879"></a><span class="lineno">10879</span>  CreateAllocationRequest_LowerAddress(</div> -<div class="line"><a name="l10880"></a><span class="lineno">10880</span>  currentFrameIndex, frameInUseCount, bufferImageGranularity,</div> -<div class="line"><a name="l10881"></a><span class="lineno">10881</span>  allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</div> -<div class="line"><a name="l10882"></a><span class="lineno">10882</span> }</div> -<div class="line"><a name="l10883"></a><span class="lineno">10883</span>  </div> -<div class="line"><a name="l10884"></a><span class="lineno">10884</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div> -<div class="line"><a name="l10885"></a><span class="lineno">10885</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l10886"></a><span class="lineno">10886</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l10887"></a><span class="lineno">10887</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l10888"></a><span class="lineno">10888</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l10889"></a><span class="lineno">10889</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l10890"></a><span class="lineno">10890</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l10891"></a><span class="lineno">10891</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l10892"></a><span class="lineno">10892</span>  uint32_t strategy,</div> -<div class="line"><a name="l10893"></a><span class="lineno">10893</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l10894"></a><span class="lineno">10894</span> {</div> -<div class="line"><a name="l10895"></a><span class="lineno">10895</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l10896"></a><span class="lineno">10896</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l10897"></a><span class="lineno">10897</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l10898"></a><span class="lineno">10898</span>  </div> -<div class="line"><a name="l10899"></a><span class="lineno">10899</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l10900"></a><span class="lineno">10900</span>  {</div> -<div class="line"><a name="l10901"></a><span class="lineno">10901</span>  VMA_ASSERT(0 && <span class="stringliteral">"Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer."</span>);</div> -<div class="line"><a name="l10902"></a><span class="lineno">10902</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l10903"></a><span class="lineno">10903</span>  }</div> +<div class="line"><a name="l10757"></a><span class="lineno">10757</span>  </div> +<div class="line"><a name="l10758"></a><span class="lineno">10758</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10759"></a><span class="lineno">10759</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> +<div class="line"><a name="l10760"></a><span class="lineno">10760</span>  {</div> +<div class="line"><a name="l10761"></a><span class="lineno">10761</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l10762"></a><span class="lineno">10762</span>  </div> +<div class="line"><a name="l10763"></a><span class="lineno">10763</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10764"></a><span class="lineno">10764</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10765"></a><span class="lineno">10765</span>  {</div> +<div class="line"><a name="l10766"></a><span class="lineno">10766</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10767"></a><span class="lineno">10767</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10768"></a><span class="lineno">10768</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10769"></a><span class="lineno">10769</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10770"></a><span class="lineno">10770</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10771"></a><span class="lineno">10771</span>  }</div> +<div class="line"><a name="l10772"></a><span class="lineno">10772</span>  </div> +<div class="line"><a name="l10773"></a><span class="lineno">10773</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10774"></a><span class="lineno">10774</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10775"></a><span class="lineno">10775</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> +<div class="line"><a name="l10776"></a><span class="lineno">10776</span>  </div> +<div class="line"><a name="l10777"></a><span class="lineno">10777</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10778"></a><span class="lineno">10778</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10779"></a><span class="lineno">10779</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l10780"></a><span class="lineno">10780</span>  }</div> +<div class="line"><a name="l10781"></a><span class="lineno">10781</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10782"></a><span class="lineno">10782</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10783"></a><span class="lineno">10783</span>  {</div> +<div class="line"><a name="l10784"></a><span class="lineno">10784</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l10785"></a><span class="lineno">10785</span>  {</div> +<div class="line"><a name="l10786"></a><span class="lineno">10786</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> +<div class="line"><a name="l10787"></a><span class="lineno">10787</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> +<div class="line"><a name="l10788"></a><span class="lineno">10788</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10789"></a><span class="lineno">10789</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10790"></a><span class="lineno">10790</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10791"></a><span class="lineno">10791</span>  }</div> +<div class="line"><a name="l10792"></a><span class="lineno">10792</span>  </div> +<div class="line"><a name="l10793"></a><span class="lineno">10793</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10794"></a><span class="lineno">10794</span>  lastOffset = freeSpace2ndTo1stEnd;</div> +<div class="line"><a name="l10795"></a><span class="lineno">10795</span>  }</div> +<div class="line"><a name="l10796"></a><span class="lineno">10796</span>  }</div> +<div class="line"><a name="l10797"></a><span class="lineno">10797</span>  }</div> +<div class="line"><a name="l10798"></a><span class="lineno">10798</span>  </div> +<div class="line"><a name="l10799"></a><span class="lineno">10799</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l10800"></a><span class="lineno">10800</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> +<div class="line"><a name="l10801"></a><span class="lineno">10801</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> +<div class="line"><a name="l10802"></a><span class="lineno">10802</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l10803"></a><span class="lineno">10803</span>  {</div> +<div class="line"><a name="l10804"></a><span class="lineno">10804</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> +<div class="line"><a name="l10805"></a><span class="lineno">10805</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> +<div class="line"><a name="l10806"></a><span class="lineno">10806</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10807"></a><span class="lineno">10807</span>  {</div> +<div class="line"><a name="l10808"></a><span class="lineno">10808</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l10809"></a><span class="lineno">10809</span>  }</div> +<div class="line"><a name="l10810"></a><span class="lineno">10810</span>  </div> +<div class="line"><a name="l10811"></a><span class="lineno">10811</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10812"></a><span class="lineno">10812</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> +<div class="line"><a name="l10813"></a><span class="lineno">10813</span>  {</div> +<div class="line"><a name="l10814"></a><span class="lineno">10814</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> +<div class="line"><a name="l10815"></a><span class="lineno">10815</span>  </div> +<div class="line"><a name="l10816"></a><span class="lineno">10816</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10817"></a><span class="lineno">10817</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10818"></a><span class="lineno">10818</span>  {</div> +<div class="line"><a name="l10819"></a><span class="lineno">10819</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10820"></a><span class="lineno">10820</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10821"></a><span class="lineno">10821</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10822"></a><span class="lineno">10822</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10823"></a><span class="lineno">10823</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10824"></a><span class="lineno">10824</span>  }</div> +<div class="line"><a name="l10825"></a><span class="lineno">10825</span>  </div> +<div class="line"><a name="l10826"></a><span class="lineno">10826</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10827"></a><span class="lineno">10827</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10828"></a><span class="lineno">10828</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> +<div class="line"><a name="l10829"></a><span class="lineno">10829</span>  </div> +<div class="line"><a name="l10830"></a><span class="lineno">10830</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10831"></a><span class="lineno">10831</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10832"></a><span class="lineno">10832</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l10833"></a><span class="lineno">10833</span>  }</div> +<div class="line"><a name="l10834"></a><span class="lineno">10834</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10835"></a><span class="lineno">10835</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10836"></a><span class="lineno">10836</span>  {</div> +<div class="line"><a name="l10837"></a><span class="lineno">10837</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l10838"></a><span class="lineno">10838</span>  {</div> +<div class="line"><a name="l10839"></a><span class="lineno">10839</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> +<div class="line"><a name="l10840"></a><span class="lineno">10840</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> +<div class="line"><a name="l10841"></a><span class="lineno">10841</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10842"></a><span class="lineno">10842</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10843"></a><span class="lineno">10843</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10844"></a><span class="lineno">10844</span>  }</div> +<div class="line"><a name="l10845"></a><span class="lineno">10845</span>  </div> +<div class="line"><a name="l10846"></a><span class="lineno">10846</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10847"></a><span class="lineno">10847</span>  lastOffset = freeSpace1stTo2ndEnd;</div> +<div class="line"><a name="l10848"></a><span class="lineno">10848</span>  }</div> +<div class="line"><a name="l10849"></a><span class="lineno">10849</span>  }</div> +<div class="line"><a name="l10850"></a><span class="lineno">10850</span>  </div> +<div class="line"><a name="l10851"></a><span class="lineno">10851</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l10852"></a><span class="lineno">10852</span>  {</div> +<div class="line"><a name="l10853"></a><span class="lineno">10853</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> +<div class="line"><a name="l10854"></a><span class="lineno">10854</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> +<div class="line"><a name="l10855"></a><span class="lineno">10855</span>  {</div> +<div class="line"><a name="l10856"></a><span class="lineno">10856</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l10857"></a><span class="lineno">10857</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> +<div class="line"><a name="l10858"></a><span class="lineno">10858</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10859"></a><span class="lineno">10859</span>  {</div> +<div class="line"><a name="l10860"></a><span class="lineno">10860</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l10861"></a><span class="lineno">10861</span>  }</div> +<div class="line"><a name="l10862"></a><span class="lineno">10862</span>  </div> +<div class="line"><a name="l10863"></a><span class="lineno">10863</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10864"></a><span class="lineno">10864</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> +<div class="line"><a name="l10865"></a><span class="lineno">10865</span>  {</div> +<div class="line"><a name="l10866"></a><span class="lineno">10866</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l10867"></a><span class="lineno">10867</span>  </div> +<div class="line"><a name="l10868"></a><span class="lineno">10868</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10869"></a><span class="lineno">10869</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10870"></a><span class="lineno">10870</span>  {</div> +<div class="line"><a name="l10871"></a><span class="lineno">10871</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10872"></a><span class="lineno">10872</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l10873"></a><span class="lineno">10873</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10874"></a><span class="lineno">10874</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10875"></a><span class="lineno">10875</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10876"></a><span class="lineno">10876</span>  }</div> +<div class="line"><a name="l10877"></a><span class="lineno">10877</span>  </div> +<div class="line"><a name="l10878"></a><span class="lineno">10878</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10879"></a><span class="lineno">10879</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10880"></a><span class="lineno">10880</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div> +<div class="line"><a name="l10881"></a><span class="lineno">10881</span>  </div> +<div class="line"><a name="l10882"></a><span class="lineno">10882</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10883"></a><span class="lineno">10883</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10884"></a><span class="lineno">10884</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l10885"></a><span class="lineno">10885</span>  }</div> +<div class="line"><a name="l10886"></a><span class="lineno">10886</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10887"></a><span class="lineno">10887</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10888"></a><span class="lineno">10888</span>  {</div> +<div class="line"><a name="l10889"></a><span class="lineno">10889</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> +<div class="line"><a name="l10890"></a><span class="lineno">10890</span>  {</div> +<div class="line"><a name="l10891"></a><span class="lineno">10891</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> +<div class="line"><a name="l10892"></a><span class="lineno">10892</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> +<div class="line"><a name="l10893"></a><span class="lineno">10893</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div> +<div class="line"><a name="l10894"></a><span class="lineno">10894</span>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l10895"></a><span class="lineno">10895</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l10896"></a><span class="lineno">10896</span>  }</div> +<div class="line"><a name="l10897"></a><span class="lineno">10897</span>  </div> +<div class="line"><a name="l10898"></a><span class="lineno">10898</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10899"></a><span class="lineno">10899</span>  lastOffset = size;</div> +<div class="line"><a name="l10900"></a><span class="lineno">10900</span>  }</div> +<div class="line"><a name="l10901"></a><span class="lineno">10901</span>  }</div> +<div class="line"><a name="l10902"></a><span class="lineno">10902</span>  }</div> +<div class="line"><a name="l10903"></a><span class="lineno">10903</span> }</div> <div class="line"><a name="l10904"></a><span class="lineno">10904</span>  </div> -<div class="line"><a name="l10905"></a><span class="lineno">10905</span>  <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div> -<div class="line"><a name="l10906"></a><span class="lineno">10906</span>  <span class="keywordflow">if</span>(allocSize > size)</div> -<div class="line"><a name="l10907"></a><span class="lineno">10907</span>  {</div> -<div class="line"><a name="l10908"></a><span class="lineno">10908</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l10909"></a><span class="lineno">10909</span>  }</div> -<div class="line"><a name="l10910"></a><span class="lineno">10910</span>  VkDeviceSize resultBaseOffset = size - allocSize;</div> -<div class="line"><a name="l10911"></a><span class="lineno">10911</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> -<div class="line"><a name="l10912"></a><span class="lineno">10912</span>  {</div> -<div class="line"><a name="l10913"></a><span class="lineno">10913</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> -<div class="line"><a name="l10914"></a><span class="lineno">10914</span>  resultBaseOffset = lastSuballoc.offset - allocSize;</div> -<div class="line"><a name="l10915"></a><span class="lineno">10915</span>  <span class="keywordflow">if</span>(allocSize > lastSuballoc.offset)</div> -<div class="line"><a name="l10916"></a><span class="lineno">10916</span>  {</div> -<div class="line"><a name="l10917"></a><span class="lineno">10917</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l10918"></a><span class="lineno">10918</span>  }</div> -<div class="line"><a name="l10919"></a><span class="lineno">10919</span>  }</div> +<div class="line"><a name="l10905"></a><span class="lineno">10905</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l10906"></a><span class="lineno">10906</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> +<div class="line"><a name="l10907"></a><span class="lineno">10907</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l10908"></a><span class="lineno">10908</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l10909"></a><span class="lineno">10909</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l10910"></a><span class="lineno">10910</span>  <span class="keyword">const</span> SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l10911"></a><span class="lineno">10911</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> +<div class="line"><a name="l10912"></a><span class="lineno">10912</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div> +<div class="line"><a name="l10913"></a><span class="lineno">10913</span>  </div> +<div class="line"><a name="l10914"></a><span class="lineno">10914</span>  <span class="comment">// FIRST PASS</span></div> +<div class="line"><a name="l10915"></a><span class="lineno">10915</span>  </div> +<div class="line"><a name="l10916"></a><span class="lineno">10916</span>  <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div> +<div class="line"><a name="l10917"></a><span class="lineno">10917</span>  VkDeviceSize usedBytes = 0;</div> +<div class="line"><a name="l10918"></a><span class="lineno">10918</span>  </div> +<div class="line"><a name="l10919"></a><span class="lineno">10919</span>  VkDeviceSize lastOffset = 0;</div> <div class="line"><a name="l10920"></a><span class="lineno">10920</span>  </div> -<div class="line"><a name="l10921"></a><span class="lineno">10921</span>  <span class="comment">// Start from offset equal to end of free space.</span></div> -<div class="line"><a name="l10922"></a><span class="lineno">10922</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> -<div class="line"><a name="l10923"></a><span class="lineno">10923</span>  </div> -<div class="line"><a name="l10924"></a><span class="lineno">10924</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div> -<div class="line"><a name="l10925"></a><span class="lineno">10925</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> -<div class="line"><a name="l10926"></a><span class="lineno">10926</span>  {</div> -<div class="line"><a name="l10927"></a><span class="lineno">10927</span>  <span class="keywordflow">if</span>(resultOffset < VMA_DEBUG_MARGIN)</div> -<div class="line"><a name="l10928"></a><span class="lineno">10928</span>  {</div> -<div class="line"><a name="l10929"></a><span class="lineno">10929</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l10930"></a><span class="lineno">10930</span>  }</div> -<div class="line"><a name="l10931"></a><span class="lineno">10931</span>  resultOffset -= VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l10932"></a><span class="lineno">10932</span>  }</div> -<div class="line"><a name="l10933"></a><span class="lineno">10933</span>  </div> -<div class="line"><a name="l10934"></a><span class="lineno">10934</span>  <span class="comment">// Apply alignment.</span></div> -<div class="line"><a name="l10935"></a><span class="lineno">10935</span>  resultOffset = VmaAlignDown(resultOffset, allocAlignment);</div> -<div class="line"><a name="l10936"></a><span class="lineno">10936</span>  </div> -<div class="line"><a name="l10937"></a><span class="lineno">10937</span>  <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l10938"></a><span class="lineno">10938</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> -<div class="line"><a name="l10939"></a><span class="lineno">10939</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && !suballocations2nd.empty())</div> -<div class="line"><a name="l10940"></a><span class="lineno">10940</span>  {</div> -<div class="line"><a name="l10941"></a><span class="lineno">10941</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> -<div class="line"><a name="l10942"></a><span class="lineno">10942</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div> -<div class="line"><a name="l10943"></a><span class="lineno">10943</span>  {</div> -<div class="line"><a name="l10944"></a><span class="lineno">10944</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];</div> -<div class="line"><a name="l10945"></a><span class="lineno">10945</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l10946"></a><span class="lineno">10946</span>  {</div> -<div class="line"><a name="l10947"></a><span class="lineno">10947</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div> -<div class="line"><a name="l10948"></a><span class="lineno">10948</span>  {</div> -<div class="line"><a name="l10949"></a><span class="lineno">10949</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> -<div class="line"><a name="l10950"></a><span class="lineno">10950</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10951"></a><span class="lineno">10951</span>  }</div> -<div class="line"><a name="l10952"></a><span class="lineno">10952</span>  }</div> -<div class="line"><a name="l10953"></a><span class="lineno">10953</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10954"></a><span class="lineno">10954</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l10955"></a><span class="lineno">10955</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10956"></a><span class="lineno">10956</span>  }</div> -<div class="line"><a name="l10957"></a><span class="lineno">10957</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> -<div class="line"><a name="l10958"></a><span class="lineno">10958</span>  {</div> -<div class="line"><a name="l10959"></a><span class="lineno">10959</span>  resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div> -<div class="line"><a name="l10960"></a><span class="lineno">10960</span>  }</div> -<div class="line"><a name="l10961"></a><span class="lineno">10961</span>  }</div> -<div class="line"><a name="l10962"></a><span class="lineno">10962</span>  </div> -<div class="line"><a name="l10963"></a><span class="lineno">10963</span>  <span class="comment">// There is enough free space.</span></div> -<div class="line"><a name="l10964"></a><span class="lineno">10964</span>  <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div> -<div class="line"><a name="l10965"></a><span class="lineno">10965</span>  suballocations1st.back().offset + suballocations1st.back().size :</div> -<div class="line"><a name="l10966"></a><span class="lineno">10966</span>  0;</div> -<div class="line"><a name="l10967"></a><span class="lineno">10967</span>  <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN <= resultOffset)</div> -<div class="line"><a name="l10968"></a><span class="lineno">10968</span>  {</div> -<div class="line"><a name="l10969"></a><span class="lineno">10969</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l10970"></a><span class="lineno">10970</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> -<div class="line"><a name="l10971"></a><span class="lineno">10971</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l10972"></a><span class="lineno">10972</span>  {</div> -<div class="line"><a name="l10973"></a><span class="lineno">10973</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div> -<div class="line"><a name="l10974"></a><span class="lineno">10974</span>  {</div> -<div class="line"><a name="l10975"></a><span class="lineno">10975</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];</div> -<div class="line"><a name="l10976"></a><span class="lineno">10976</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> -<div class="line"><a name="l10977"></a><span class="lineno">10977</span>  {</div> -<div class="line"><a name="l10978"></a><span class="lineno">10978</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div> -<div class="line"><a name="l10979"></a><span class="lineno">10979</span>  {</div> -<div class="line"><a name="l10980"></a><span class="lineno">10980</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l10981"></a><span class="lineno">10981</span>  }</div> -<div class="line"><a name="l10982"></a><span class="lineno">10982</span>  }</div> -<div class="line"><a name="l10983"></a><span class="lineno">10983</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l10984"></a><span class="lineno">10984</span>  {</div> -<div class="line"><a name="l10985"></a><span class="lineno">10985</span>  <span class="comment">// Already on next page.</span></div> -<div class="line"><a name="l10986"></a><span class="lineno">10986</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l10987"></a><span class="lineno">10987</span>  }</div> -<div class="line"><a name="l10988"></a><span class="lineno">10988</span>  }</div> -<div class="line"><a name="l10989"></a><span class="lineno">10989</span>  }</div> -<div class="line"><a name="l10990"></a><span class="lineno">10990</span>  </div> -<div class="line"><a name="l10991"></a><span class="lineno">10991</span>  <span class="comment">// All tests passed: Success.</span></div> -<div class="line"><a name="l10992"></a><span class="lineno">10992</span>  pAllocationRequest->offset = resultOffset;</div> -<div class="line"><a name="l10993"></a><span class="lineno">10993</span>  pAllocationRequest->sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div> -<div class="line"><a name="l10994"></a><span class="lineno">10994</span>  pAllocationRequest->sumItemSize = 0;</div> -<div class="line"><a name="l10995"></a><span class="lineno">10995</span>  <span class="comment">// pAllocationRequest->item unused.</span></div> -<div class="line"><a name="l10996"></a><span class="lineno">10996</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> -<div class="line"><a name="l10997"></a><span class="lineno">10997</span>  pAllocationRequest->type = VmaAllocationRequestType::UpperAddress;</div> -<div class="line"><a name="l10998"></a><span class="lineno">10998</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l10999"></a><span class="lineno">10999</span>  }</div> +<div class="line"><a name="l10921"></a><span class="lineno">10921</span>  <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div> +<div class="line"><a name="l10922"></a><span class="lineno">10922</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l10923"></a><span class="lineno">10923</span>  {</div> +<div class="line"><a name="l10924"></a><span class="lineno">10924</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> +<div class="line"><a name="l10925"></a><span class="lineno">10925</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div> +<div class="line"><a name="l10926"></a><span class="lineno">10926</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l10927"></a><span class="lineno">10927</span>  {</div> +<div class="line"><a name="l10928"></a><span class="lineno">10928</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l10929"></a><span class="lineno">10929</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> +<div class="line"><a name="l10930"></a><span class="lineno">10930</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10931"></a><span class="lineno">10931</span>  {</div> +<div class="line"><a name="l10932"></a><span class="lineno">10932</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l10933"></a><span class="lineno">10933</span>  }</div> +<div class="line"><a name="l10934"></a><span class="lineno">10934</span>  </div> +<div class="line"><a name="l10935"></a><span class="lineno">10935</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10936"></a><span class="lineno">10936</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> +<div class="line"><a name="l10937"></a><span class="lineno">10937</span>  {</div> +<div class="line"><a name="l10938"></a><span class="lineno">10938</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l10939"></a><span class="lineno">10939</span>  </div> +<div class="line"><a name="l10940"></a><span class="lineno">10940</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10941"></a><span class="lineno">10941</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10942"></a><span class="lineno">10942</span>  {</div> +<div class="line"><a name="l10943"></a><span class="lineno">10943</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10944"></a><span class="lineno">10944</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l10945"></a><span class="lineno">10945</span>  }</div> +<div class="line"><a name="l10946"></a><span class="lineno">10946</span>  </div> +<div class="line"><a name="l10947"></a><span class="lineno">10947</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10948"></a><span class="lineno">10948</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10949"></a><span class="lineno">10949</span>  ++alloc2ndCount;</div> +<div class="line"><a name="l10950"></a><span class="lineno">10950</span>  usedBytes += suballoc.size;</div> +<div class="line"><a name="l10951"></a><span class="lineno">10951</span>  </div> +<div class="line"><a name="l10952"></a><span class="lineno">10952</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l10953"></a><span class="lineno">10953</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l10954"></a><span class="lineno">10954</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l10955"></a><span class="lineno">10955</span>  }</div> +<div class="line"><a name="l10956"></a><span class="lineno">10956</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l10957"></a><span class="lineno">10957</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l10958"></a><span class="lineno">10958</span>  {</div> +<div class="line"><a name="l10959"></a><span class="lineno">10959</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l10960"></a><span class="lineno">10960</span>  {</div> +<div class="line"><a name="l10961"></a><span class="lineno">10961</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> +<div class="line"><a name="l10962"></a><span class="lineno">10962</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l10963"></a><span class="lineno">10963</span>  }</div> +<div class="line"><a name="l10964"></a><span class="lineno">10964</span>  </div> +<div class="line"><a name="l10965"></a><span class="lineno">10965</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l10966"></a><span class="lineno">10966</span>  lastOffset = freeSpace2ndTo1stEnd;</div> +<div class="line"><a name="l10967"></a><span class="lineno">10967</span>  }</div> +<div class="line"><a name="l10968"></a><span class="lineno">10968</span>  }</div> +<div class="line"><a name="l10969"></a><span class="lineno">10969</span>  }</div> +<div class="line"><a name="l10970"></a><span class="lineno">10970</span>  </div> +<div class="line"><a name="l10971"></a><span class="lineno">10971</span>  <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l10972"></a><span class="lineno">10972</span>  <span class="keywordtype">size_t</span> alloc1stCount = 0;</div> +<div class="line"><a name="l10973"></a><span class="lineno">10973</span>  <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div> +<div class="line"><a name="l10974"></a><span class="lineno">10974</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div> +<div class="line"><a name="l10975"></a><span class="lineno">10975</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l10976"></a><span class="lineno">10976</span>  {</div> +<div class="line"><a name="l10977"></a><span class="lineno">10977</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> +<div class="line"><a name="l10978"></a><span class="lineno">10978</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> +<div class="line"><a name="l10979"></a><span class="lineno">10979</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l10980"></a><span class="lineno">10980</span>  {</div> +<div class="line"><a name="l10981"></a><span class="lineno">10981</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l10982"></a><span class="lineno">10982</span>  }</div> +<div class="line"><a name="l10983"></a><span class="lineno">10983</span>  </div> +<div class="line"><a name="l10984"></a><span class="lineno">10984</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l10985"></a><span class="lineno">10985</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> +<div class="line"><a name="l10986"></a><span class="lineno">10986</span>  {</div> +<div class="line"><a name="l10987"></a><span class="lineno">10987</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> +<div class="line"><a name="l10988"></a><span class="lineno">10988</span>  </div> +<div class="line"><a name="l10989"></a><span class="lineno">10989</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l10990"></a><span class="lineno">10990</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l10991"></a><span class="lineno">10991</span>  {</div> +<div class="line"><a name="l10992"></a><span class="lineno">10992</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l10993"></a><span class="lineno">10993</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l10994"></a><span class="lineno">10994</span>  }</div> +<div class="line"><a name="l10995"></a><span class="lineno">10995</span>  </div> +<div class="line"><a name="l10996"></a><span class="lineno">10996</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l10997"></a><span class="lineno">10997</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l10998"></a><span class="lineno">10998</span>  ++alloc1stCount;</div> +<div class="line"><a name="l10999"></a><span class="lineno">10999</span>  usedBytes += suballoc.size;</div> <div class="line"><a name="l11000"></a><span class="lineno">11000</span>  </div> -<div class="line"><a name="l11001"></a><span class="lineno">11001</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11002"></a><span class="lineno">11002</span> }</div> -<div class="line"><a name="l11003"></a><span class="lineno">11003</span>  </div> -<div class="line"><a name="l11004"></a><span class="lineno">11004</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div> -<div class="line"><a name="l11005"></a><span class="lineno">11005</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l11006"></a><span class="lineno">11006</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l11007"></a><span class="lineno">11007</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l11008"></a><span class="lineno">11008</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l11009"></a><span class="lineno">11009</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l11010"></a><span class="lineno">11010</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l11011"></a><span class="lineno">11011</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l11012"></a><span class="lineno">11012</span>  uint32_t strategy,</div> -<div class="line"><a name="l11013"></a><span class="lineno">11013</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l11014"></a><span class="lineno">11014</span> {</div> -<div class="line"><a name="l11015"></a><span class="lineno">11015</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> -<div class="line"><a name="l11016"></a><span class="lineno">11016</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11017"></a><span class="lineno">11017</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11001"></a><span class="lineno">11001</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l11002"></a><span class="lineno">11002</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l11003"></a><span class="lineno">11003</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l11004"></a><span class="lineno">11004</span>  }</div> +<div class="line"><a name="l11005"></a><span class="lineno">11005</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l11006"></a><span class="lineno">11006</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11007"></a><span class="lineno">11007</span>  {</div> +<div class="line"><a name="l11008"></a><span class="lineno">11008</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> +<div class="line"><a name="l11009"></a><span class="lineno">11009</span>  {</div> +<div class="line"><a name="l11010"></a><span class="lineno">11010</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> +<div class="line"><a name="l11011"></a><span class="lineno">11011</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l11012"></a><span class="lineno">11012</span>  }</div> +<div class="line"><a name="l11013"></a><span class="lineno">11013</span>  </div> +<div class="line"><a name="l11014"></a><span class="lineno">11014</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l11015"></a><span class="lineno">11015</span>  lastOffset = freeSpace1stTo2ndEnd;</div> +<div class="line"><a name="l11016"></a><span class="lineno">11016</span>  }</div> +<div class="line"><a name="l11017"></a><span class="lineno">11017</span>  }</div> <div class="line"><a name="l11018"></a><span class="lineno">11018</span>  </div> -<div class="line"><a name="l11019"></a><span class="lineno">11019</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l11019"></a><span class="lineno">11019</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> <div class="line"><a name="l11020"></a><span class="lineno">11020</span>  {</div> -<div class="line"><a name="l11021"></a><span class="lineno">11021</span>  <span class="comment">// Try to allocate at the end of 1st vector.</span></div> -<div class="line"><a name="l11022"></a><span class="lineno">11022</span>  </div> -<div class="line"><a name="l11023"></a><span class="lineno">11023</span>  VkDeviceSize resultBaseOffset = 0;</div> -<div class="line"><a name="l11024"></a><span class="lineno">11024</span>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> -<div class="line"><a name="l11025"></a><span class="lineno">11025</span>  {</div> -<div class="line"><a name="l11026"></a><span class="lineno">11026</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations1st.back();</div> -<div class="line"><a name="l11027"></a><span class="lineno">11027</span>  resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div> -<div class="line"><a name="l11028"></a><span class="lineno">11028</span>  }</div> -<div class="line"><a name="l11029"></a><span class="lineno">11029</span>  </div> -<div class="line"><a name="l11030"></a><span class="lineno">11030</span>  <span class="comment">// Start from offset equal to beginning of free space.</span></div> -<div class="line"><a name="l11031"></a><span class="lineno">11031</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> -<div class="line"><a name="l11032"></a><span class="lineno">11032</span>  </div> -<div class="line"><a name="l11033"></a><span class="lineno">11033</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> -<div class="line"><a name="l11034"></a><span class="lineno">11034</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> -<div class="line"><a name="l11035"></a><span class="lineno">11035</span>  {</div> -<div class="line"><a name="l11036"></a><span class="lineno">11036</span>  resultOffset += VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l11037"></a><span class="lineno">11037</span>  }</div> -<div class="line"><a name="l11038"></a><span class="lineno">11038</span>  </div> -<div class="line"><a name="l11039"></a><span class="lineno">11039</span>  <span class="comment">// Apply alignment.</span></div> -<div class="line"><a name="l11040"></a><span class="lineno">11040</span>  resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div> -<div class="line"><a name="l11041"></a><span class="lineno">11041</span>  </div> -<div class="line"><a name="l11042"></a><span class="lineno">11042</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l11043"></a><span class="lineno">11043</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> -<div class="line"><a name="l11044"></a><span class="lineno">11044</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && !suballocations1st.empty())</div> -<div class="line"><a name="l11045"></a><span class="lineno">11045</span>  {</div> -<div class="line"><a name="l11046"></a><span class="lineno">11046</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> -<div class="line"><a name="l11047"></a><span class="lineno">11047</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div> -<div class="line"><a name="l11048"></a><span class="lineno">11048</span>  {</div> -<div class="line"><a name="l11049"></a><span class="lineno">11049</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];</div> -<div class="line"><a name="l11050"></a><span class="lineno">11050</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> -<div class="line"><a name="l11051"></a><span class="lineno">11051</span>  {</div> -<div class="line"><a name="l11052"></a><span class="lineno">11052</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> -<div class="line"><a name="l11053"></a><span class="lineno">11053</span>  {</div> -<div class="line"><a name="l11054"></a><span class="lineno">11054</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> -<div class="line"><a name="l11055"></a><span class="lineno">11055</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11056"></a><span class="lineno">11056</span>  }</div> -<div class="line"><a name="l11057"></a><span class="lineno">11057</span>  }</div> -<div class="line"><a name="l11058"></a><span class="lineno">11058</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11059"></a><span class="lineno">11059</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l11060"></a><span class="lineno">11060</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11061"></a><span class="lineno">11061</span>  }</div> -<div class="line"><a name="l11062"></a><span class="lineno">11062</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> -<div class="line"><a name="l11063"></a><span class="lineno">11063</span>  {</div> -<div class="line"><a name="l11064"></a><span class="lineno">11064</span>  resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div> -<div class="line"><a name="l11065"></a><span class="lineno">11065</span>  }</div> -<div class="line"><a name="l11066"></a><span class="lineno">11066</span>  }</div> -<div class="line"><a name="l11067"></a><span class="lineno">11067</span>  </div> -<div class="line"><a name="l11068"></a><span class="lineno">11068</span>  <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div> -<div class="line"><a name="l11069"></a><span class="lineno">11069</span>  suballocations2nd.back().offset : size;</div> -<div class="line"><a name="l11070"></a><span class="lineno">11070</span>  </div> -<div class="line"><a name="l11071"></a><span class="lineno">11071</span>  <span class="comment">// There is enough free space at the end after alignment.</span></div> -<div class="line"><a name="l11072"></a><span class="lineno">11072</span>  <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN <= freeSpaceEnd)</div> -<div class="line"><a name="l11073"></a><span class="lineno">11073</span>  {</div> -<div class="line"><a name="l11074"></a><span class="lineno">11074</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l11075"></a><span class="lineno">11075</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> -<div class="line"><a name="l11076"></a><span class="lineno">11076</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l11077"></a><span class="lineno">11077</span>  {</div> -<div class="line"><a name="l11078"></a><span class="lineno">11078</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div> -<div class="line"><a name="l11079"></a><span class="lineno">11079</span>  {</div> -<div class="line"><a name="l11080"></a><span class="lineno">11080</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];</div> -<div class="line"><a name="l11081"></a><span class="lineno">11081</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l11082"></a><span class="lineno">11082</span>  {</div> -<div class="line"><a name="l11083"></a><span class="lineno">11083</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> -<div class="line"><a name="l11084"></a><span class="lineno">11084</span>  {</div> -<div class="line"><a name="l11085"></a><span class="lineno">11085</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11086"></a><span class="lineno">11086</span>  }</div> -<div class="line"><a name="l11087"></a><span class="lineno">11087</span>  }</div> -<div class="line"><a name="l11088"></a><span class="lineno">11088</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11089"></a><span class="lineno">11089</span>  {</div> -<div class="line"><a name="l11090"></a><span class="lineno">11090</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l11091"></a><span class="lineno">11091</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11092"></a><span class="lineno">11092</span>  }</div> -<div class="line"><a name="l11093"></a><span class="lineno">11093</span>  }</div> -<div class="line"><a name="l11094"></a><span class="lineno">11094</span>  }</div> -<div class="line"><a name="l11095"></a><span class="lineno">11095</span>  </div> -<div class="line"><a name="l11096"></a><span class="lineno">11096</span>  <span class="comment">// All tests passed: Success.</span></div> -<div class="line"><a name="l11097"></a><span class="lineno">11097</span>  pAllocationRequest->offset = resultOffset;</div> -<div class="line"><a name="l11098"></a><span class="lineno">11098</span>  pAllocationRequest->sumFreeSize = freeSpaceEnd - resultBaseOffset;</div> -<div class="line"><a name="l11099"></a><span class="lineno">11099</span>  pAllocationRequest->sumItemSize = 0;</div> -<div class="line"><a name="l11100"></a><span class="lineno">11100</span>  <span class="comment">// pAllocationRequest->item, customData unused.</span></div> -<div class="line"><a name="l11101"></a><span class="lineno">11101</span>  pAllocationRequest->type = VmaAllocationRequestType::EndOf1st;</div> -<div class="line"><a name="l11102"></a><span class="lineno">11102</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> -<div class="line"><a name="l11103"></a><span class="lineno">11103</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11104"></a><span class="lineno">11104</span>  }</div> -<div class="line"><a name="l11105"></a><span class="lineno">11105</span>  }</div> -<div class="line"><a name="l11106"></a><span class="lineno">11106</span>  </div> -<div class="line"><a name="l11107"></a><span class="lineno">11107</span>  <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div> -<div class="line"><a name="l11108"></a><span class="lineno">11108</span>  <span class="comment">// beginning of 1st vector as the end of free space.</span></div> -<div class="line"><a name="l11109"></a><span class="lineno">11109</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l11110"></a><span class="lineno">11110</span>  {</div> -<div class="line"><a name="l11111"></a><span class="lineno">11111</span>  VMA_ASSERT(!suballocations1st.empty());</div> -<div class="line"><a name="l11112"></a><span class="lineno">11112</span>  </div> -<div class="line"><a name="l11113"></a><span class="lineno">11113</span>  VkDeviceSize resultBaseOffset = 0;</div> -<div class="line"><a name="l11114"></a><span class="lineno">11114</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> -<div class="line"><a name="l11115"></a><span class="lineno">11115</span>  {</div> -<div class="line"><a name="l11116"></a><span class="lineno">11116</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> -<div class="line"><a name="l11117"></a><span class="lineno">11117</span>  resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div> -<div class="line"><a name="l11118"></a><span class="lineno">11118</span>  }</div> -<div class="line"><a name="l11119"></a><span class="lineno">11119</span>  </div> -<div class="line"><a name="l11120"></a><span class="lineno">11120</span>  <span class="comment">// Start from offset equal to beginning of free space.</span></div> -<div class="line"><a name="l11121"></a><span class="lineno">11121</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> +<div class="line"><a name="l11021"></a><span class="lineno">11021</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> +<div class="line"><a name="l11022"></a><span class="lineno">11022</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> +<div class="line"><a name="l11023"></a><span class="lineno">11023</span>  {</div> +<div class="line"><a name="l11024"></a><span class="lineno">11024</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l11025"></a><span class="lineno">11025</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> +<div class="line"><a name="l11026"></a><span class="lineno">11026</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l11027"></a><span class="lineno">11027</span>  {</div> +<div class="line"><a name="l11028"></a><span class="lineno">11028</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l11029"></a><span class="lineno">11029</span>  }</div> +<div class="line"><a name="l11030"></a><span class="lineno">11030</span>  </div> +<div class="line"><a name="l11031"></a><span class="lineno">11031</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l11032"></a><span class="lineno">11032</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> +<div class="line"><a name="l11033"></a><span class="lineno">11033</span>  {</div> +<div class="line"><a name="l11034"></a><span class="lineno">11034</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l11035"></a><span class="lineno">11035</span>  </div> +<div class="line"><a name="l11036"></a><span class="lineno">11036</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l11037"></a><span class="lineno">11037</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l11038"></a><span class="lineno">11038</span>  {</div> +<div class="line"><a name="l11039"></a><span class="lineno">11039</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l11040"></a><span class="lineno">11040</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l11041"></a><span class="lineno">11041</span>  }</div> +<div class="line"><a name="l11042"></a><span class="lineno">11042</span>  </div> +<div class="line"><a name="l11043"></a><span class="lineno">11043</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l11044"></a><span class="lineno">11044</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l11045"></a><span class="lineno">11045</span>  ++alloc2ndCount;</div> +<div class="line"><a name="l11046"></a><span class="lineno">11046</span>  usedBytes += suballoc.size;</div> +<div class="line"><a name="l11047"></a><span class="lineno">11047</span>  </div> +<div class="line"><a name="l11048"></a><span class="lineno">11048</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l11049"></a><span class="lineno">11049</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l11050"></a><span class="lineno">11050</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l11051"></a><span class="lineno">11051</span>  }</div> +<div class="line"><a name="l11052"></a><span class="lineno">11052</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l11053"></a><span class="lineno">11053</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11054"></a><span class="lineno">11054</span>  {</div> +<div class="line"><a name="l11055"></a><span class="lineno">11055</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> +<div class="line"><a name="l11056"></a><span class="lineno">11056</span>  {</div> +<div class="line"><a name="l11057"></a><span class="lineno">11057</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> +<div class="line"><a name="l11058"></a><span class="lineno">11058</span>  ++unusedRangeCount;</div> +<div class="line"><a name="l11059"></a><span class="lineno">11059</span>  }</div> +<div class="line"><a name="l11060"></a><span class="lineno">11060</span>  </div> +<div class="line"><a name="l11061"></a><span class="lineno">11061</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l11062"></a><span class="lineno">11062</span>  lastOffset = size;</div> +<div class="line"><a name="l11063"></a><span class="lineno">11063</span>  }</div> +<div class="line"><a name="l11064"></a><span class="lineno">11064</span>  }</div> +<div class="line"><a name="l11065"></a><span class="lineno">11065</span>  }</div> +<div class="line"><a name="l11066"></a><span class="lineno">11066</span>  </div> +<div class="line"><a name="l11067"></a><span class="lineno">11067</span>  <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div> +<div class="line"><a name="l11068"></a><span class="lineno">11068</span>  PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div> +<div class="line"><a name="l11069"></a><span class="lineno">11069</span>  </div> +<div class="line"><a name="l11070"></a><span class="lineno">11070</span>  <span class="comment">// SECOND PASS</span></div> +<div class="line"><a name="l11071"></a><span class="lineno">11071</span>  lastOffset = 0;</div> +<div class="line"><a name="l11072"></a><span class="lineno">11072</span>  </div> +<div class="line"><a name="l11073"></a><span class="lineno">11073</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l11074"></a><span class="lineno">11074</span>  {</div> +<div class="line"><a name="l11075"></a><span class="lineno">11075</span>  <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div> +<div class="line"><a name="l11076"></a><span class="lineno">11076</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div> +<div class="line"><a name="l11077"></a><span class="lineno">11077</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l11078"></a><span class="lineno">11078</span>  {</div> +<div class="line"><a name="l11079"></a><span class="lineno">11079</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l11080"></a><span class="lineno">11080</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex < suballoc2ndCount &&</div> +<div class="line"><a name="l11081"></a><span class="lineno">11081</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l11082"></a><span class="lineno">11082</span>  {</div> +<div class="line"><a name="l11083"></a><span class="lineno">11083</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l11084"></a><span class="lineno">11084</span>  }</div> +<div class="line"><a name="l11085"></a><span class="lineno">11085</span>  </div> +<div class="line"><a name="l11086"></a><span class="lineno">11086</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l11087"></a><span class="lineno">11087</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex < suballoc2ndCount)</div> +<div class="line"><a name="l11088"></a><span class="lineno">11088</span>  {</div> +<div class="line"><a name="l11089"></a><span class="lineno">11089</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l11090"></a><span class="lineno">11090</span>  </div> +<div class="line"><a name="l11091"></a><span class="lineno">11091</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l11092"></a><span class="lineno">11092</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l11093"></a><span class="lineno">11093</span>  {</div> +<div class="line"><a name="l11094"></a><span class="lineno">11094</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l11095"></a><span class="lineno">11095</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l11096"></a><span class="lineno">11096</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11097"></a><span class="lineno">11097</span>  }</div> +<div class="line"><a name="l11098"></a><span class="lineno">11098</span>  </div> +<div class="line"><a name="l11099"></a><span class="lineno">11099</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l11100"></a><span class="lineno">11100</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l11101"></a><span class="lineno">11101</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> +<div class="line"><a name="l11102"></a><span class="lineno">11102</span>  </div> +<div class="line"><a name="l11103"></a><span class="lineno">11103</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l11104"></a><span class="lineno">11104</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l11105"></a><span class="lineno">11105</span>  ++nextAlloc2ndIndex;</div> +<div class="line"><a name="l11106"></a><span class="lineno">11106</span>  }</div> +<div class="line"><a name="l11107"></a><span class="lineno">11107</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l11108"></a><span class="lineno">11108</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11109"></a><span class="lineno">11109</span>  {</div> +<div class="line"><a name="l11110"></a><span class="lineno">11110</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace2ndTo1stEnd)</div> +<div class="line"><a name="l11111"></a><span class="lineno">11111</span>  {</div> +<div class="line"><a name="l11112"></a><span class="lineno">11112</span>  <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div> +<div class="line"><a name="l11113"></a><span class="lineno">11113</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div> +<div class="line"><a name="l11114"></a><span class="lineno">11114</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11115"></a><span class="lineno">11115</span>  }</div> +<div class="line"><a name="l11116"></a><span class="lineno">11116</span>  </div> +<div class="line"><a name="l11117"></a><span class="lineno">11117</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l11118"></a><span class="lineno">11118</span>  lastOffset = freeSpace2ndTo1stEnd;</div> +<div class="line"><a name="l11119"></a><span class="lineno">11119</span>  }</div> +<div class="line"><a name="l11120"></a><span class="lineno">11120</span>  }</div> +<div class="line"><a name="l11121"></a><span class="lineno">11121</span>  }</div> <div class="line"><a name="l11122"></a><span class="lineno">11122</span>  </div> -<div class="line"><a name="l11123"></a><span class="lineno">11123</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> -<div class="line"><a name="l11124"></a><span class="lineno">11124</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> -<div class="line"><a name="l11125"></a><span class="lineno">11125</span>  {</div> -<div class="line"><a name="l11126"></a><span class="lineno">11126</span>  resultOffset += VMA_DEBUG_MARGIN;</div> -<div class="line"><a name="l11127"></a><span class="lineno">11127</span>  }</div> -<div class="line"><a name="l11128"></a><span class="lineno">11128</span>  </div> -<div class="line"><a name="l11129"></a><span class="lineno">11129</span>  <span class="comment">// Apply alignment.</span></div> -<div class="line"><a name="l11130"></a><span class="lineno">11130</span>  resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div> -<div class="line"><a name="l11131"></a><span class="lineno">11131</span>  </div> -<div class="line"><a name="l11132"></a><span class="lineno">11132</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l11133"></a><span class="lineno">11133</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> -<div class="line"><a name="l11134"></a><span class="lineno">11134</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && !suballocations2nd.empty())</div> +<div class="line"><a name="l11123"></a><span class="lineno">11123</span>  nextAlloc1stIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l11124"></a><span class="lineno">11124</span>  <span class="keywordflow">while</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l11125"></a><span class="lineno">11125</span>  {</div> +<div class="line"><a name="l11126"></a><span class="lineno">11126</span>  <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div> +<div class="line"><a name="l11127"></a><span class="lineno">11127</span>  <span class="keywordflow">while</span>(nextAlloc1stIndex < suballoc1stCount &&</div> +<div class="line"><a name="l11128"></a><span class="lineno">11128</span>  suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l11129"></a><span class="lineno">11129</span>  {</div> +<div class="line"><a name="l11130"></a><span class="lineno">11130</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l11131"></a><span class="lineno">11131</span>  }</div> +<div class="line"><a name="l11132"></a><span class="lineno">11132</span>  </div> +<div class="line"><a name="l11133"></a><span class="lineno">11133</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l11134"></a><span class="lineno">11134</span>  <span class="keywordflow">if</span>(nextAlloc1stIndex < suballoc1stCount)</div> <div class="line"><a name="l11135"></a><span class="lineno">11135</span>  {</div> -<div class="line"><a name="l11136"></a><span class="lineno">11136</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> -<div class="line"><a name="l11137"></a><span class="lineno">11137</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</div> -<div class="line"><a name="l11138"></a><span class="lineno">11138</span>  {</div> -<div class="line"><a name="l11139"></a><span class="lineno">11139</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations2nd[prevSuballocIndex];</div> -<div class="line"><a name="l11140"></a><span class="lineno">11140</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> -<div class="line"><a name="l11141"></a><span class="lineno">11141</span>  {</div> -<div class="line"><a name="l11142"></a><span class="lineno">11142</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> -<div class="line"><a name="l11143"></a><span class="lineno">11143</span>  {</div> -<div class="line"><a name="l11144"></a><span class="lineno">11144</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> -<div class="line"><a name="l11145"></a><span class="lineno">11145</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11146"></a><span class="lineno">11146</span>  }</div> -<div class="line"><a name="l11147"></a><span class="lineno">11147</span>  }</div> -<div class="line"><a name="l11148"></a><span class="lineno">11148</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11149"></a><span class="lineno">11149</span>  <span class="comment">// Already on previous page.</span></div> -<div class="line"><a name="l11150"></a><span class="lineno">11150</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11151"></a><span class="lineno">11151</span>  }</div> -<div class="line"><a name="l11152"></a><span class="lineno">11152</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> -<div class="line"><a name="l11153"></a><span class="lineno">11153</span>  {</div> -<div class="line"><a name="l11154"></a><span class="lineno">11154</span>  resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div> -<div class="line"><a name="l11155"></a><span class="lineno">11155</span>  }</div> -<div class="line"><a name="l11156"></a><span class="lineno">11156</span>  }</div> -<div class="line"><a name="l11157"></a><span class="lineno">11157</span>  </div> -<div class="line"><a name="l11158"></a><span class="lineno">11158</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> -<div class="line"><a name="l11159"></a><span class="lineno">11159</span>  pAllocationRequest->sumItemSize = 0;</div> -<div class="line"><a name="l11160"></a><span class="lineno">11160</span>  <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11161"></a><span class="lineno">11161</span>  </div> -<div class="line"><a name="l11162"></a><span class="lineno">11162</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> -<div class="line"><a name="l11163"></a><span class="lineno">11163</span>  {</div> -<div class="line"><a name="l11164"></a><span class="lineno">11164</span>  <span class="keywordflow">while</span>(index1st < suballocations1st.size() &&</div> -<div class="line"><a name="l11165"></a><span class="lineno">11165</span>  resultOffset + allocSize + VMA_DEBUG_MARGIN > suballocations1st[index1st].offset)</div> -<div class="line"><a name="l11166"></a><span class="lineno">11166</span>  {</div> -<div class="line"><a name="l11167"></a><span class="lineno">11167</span>  <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div> -<div class="line"><a name="l11168"></a><span class="lineno">11168</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[index1st];</div> -<div class="line"><a name="l11169"></a><span class="lineno">11169</span>  <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l11170"></a><span class="lineno">11170</span>  {</div> -<div class="line"><a name="l11171"></a><span class="lineno">11171</span>  <span class="comment">// No problem.</span></div> -<div class="line"><a name="l11172"></a><span class="lineno">11172</span>  }</div> -<div class="line"><a name="l11173"></a><span class="lineno">11173</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11174"></a><span class="lineno">11174</span>  {</div> -<div class="line"><a name="l11175"></a><span class="lineno">11175</span>  VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l11176"></a><span class="lineno">11176</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l11177"></a><span class="lineno">11177</span>  suballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> -<div class="line"><a name="l11178"></a><span class="lineno">11178</span>  {</div> -<div class="line"><a name="l11179"></a><span class="lineno">11179</span>  ++pAllocationRequest->itemsToMakeLostCount;</div> -<div class="line"><a name="l11180"></a><span class="lineno">11180</span>  pAllocationRequest->sumItemSize += suballoc.size;</div> -<div class="line"><a name="l11181"></a><span class="lineno">11181</span>  }</div> -<div class="line"><a name="l11182"></a><span class="lineno">11182</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11183"></a><span class="lineno">11183</span>  {</div> -<div class="line"><a name="l11184"></a><span class="lineno">11184</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11185"></a><span class="lineno">11185</span>  }</div> -<div class="line"><a name="l11186"></a><span class="lineno">11186</span>  }</div> -<div class="line"><a name="l11187"></a><span class="lineno">11187</span>  ++index1st;</div> -<div class="line"><a name="l11188"></a><span class="lineno">11188</span>  }</div> -<div class="line"><a name="l11189"></a><span class="lineno">11189</span>  </div> -<div class="line"><a name="l11190"></a><span class="lineno">11190</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l11191"></a><span class="lineno">11191</span>  <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div> -<div class="line"><a name="l11192"></a><span class="lineno">11192</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l11193"></a><span class="lineno">11193</span>  {</div> -<div class="line"><a name="l11194"></a><span class="lineno">11194</span>  <span class="keywordflow">while</span>(index1st < suballocations1st.size())</div> -<div class="line"><a name="l11195"></a><span class="lineno">11195</span>  {</div> -<div class="line"><a name="l11196"></a><span class="lineno">11196</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[index1st];</div> -<div class="line"><a name="l11197"></a><span class="lineno">11197</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l11198"></a><span class="lineno">11198</span>  {</div> -<div class="line"><a name="l11199"></a><span class="lineno">11199</span>  <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div> -<div class="line"><a name="l11200"></a><span class="lineno">11200</span>  {</div> -<div class="line"><a name="l11201"></a><span class="lineno">11201</span>  <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div> -<div class="line"><a name="l11202"></a><span class="lineno">11202</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l11203"></a><span class="lineno">11203</span>  suballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> -<div class="line"><a name="l11204"></a><span class="lineno">11204</span>  {</div> -<div class="line"><a name="l11205"></a><span class="lineno">11205</span>  ++pAllocationRequest->itemsToMakeLostCount;</div> -<div class="line"><a name="l11206"></a><span class="lineno">11206</span>  pAllocationRequest->sumItemSize += suballoc.size;</div> -<div class="line"><a name="l11207"></a><span class="lineno">11207</span>  }</div> -<div class="line"><a name="l11208"></a><span class="lineno">11208</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11209"></a><span class="lineno">11209</span>  {</div> -<div class="line"><a name="l11210"></a><span class="lineno">11210</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11211"></a><span class="lineno">11211</span>  }</div> -<div class="line"><a name="l11212"></a><span class="lineno">11212</span>  }</div> -<div class="line"><a name="l11213"></a><span class="lineno">11213</span>  }</div> -<div class="line"><a name="l11214"></a><span class="lineno">11214</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11215"></a><span class="lineno">11215</span>  {</div> -<div class="line"><a name="l11216"></a><span class="lineno">11216</span>  <span class="comment">// Already on next page.</span></div> -<div class="line"><a name="l11217"></a><span class="lineno">11217</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11218"></a><span class="lineno">11218</span>  }</div> -<div class="line"><a name="l11219"></a><span class="lineno">11219</span>  ++index1st;</div> -<div class="line"><a name="l11220"></a><span class="lineno">11220</span>  }</div> -<div class="line"><a name="l11221"></a><span class="lineno">11221</span>  }</div> -<div class="line"><a name="l11222"></a><span class="lineno">11222</span>  </div> -<div class="line"><a name="l11223"></a><span class="lineno">11223</span>  <span class="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div> -<div class="line"><a name="l11224"></a><span class="lineno">11224</span>  <span class="keywordflow">if</span>(index1st == suballocations1st.size() &&</div> -<div class="line"><a name="l11225"></a><span class="lineno">11225</span>  resultOffset + allocSize + VMA_DEBUG_MARGIN > size)</div> -<div class="line"><a name="l11226"></a><span class="lineno">11226</span>  {</div> -<div class="line"><a name="l11227"></a><span class="lineno">11227</span>  <span class="comment">// TODO: This is a known bug that it's not yet implemented and the allocation is failing.</span></div> -<div class="line"><a name="l11228"></a><span class="lineno">11228</span>  VMA_DEBUG_LOG(<span class="stringliteral">"Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost."</span>);</div> -<div class="line"><a name="l11229"></a><span class="lineno">11229</span>  }</div> -<div class="line"><a name="l11230"></a><span class="lineno">11230</span>  }</div> -<div class="line"><a name="l11231"></a><span class="lineno">11231</span>  </div> -<div class="line"><a name="l11232"></a><span class="lineno">11232</span>  <span class="comment">// There is enough free space at the end after alignment.</span></div> -<div class="line"><a name="l11233"></a><span class="lineno">11233</span>  <span class="keywordflow">if</span>((index1st == suballocations1st.size() && resultOffset + allocSize + VMA_DEBUG_MARGIN <= size) ||</div> -<div class="line"><a name="l11234"></a><span class="lineno">11234</span>  (index1st < suballocations1st.size() && resultOffset + allocSize + VMA_DEBUG_MARGIN <= suballocations1st[index1st].offset))</div> -<div class="line"><a name="l11235"></a><span class="lineno">11235</span>  {</div> -<div class="line"><a name="l11236"></a><span class="lineno">11236</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> -<div class="line"><a name="l11237"></a><span class="lineno">11237</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> -<div class="line"><a name="l11238"></a><span class="lineno">11238</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> -<div class="line"><a name="l11239"></a><span class="lineno">11239</span>  {</div> -<div class="line"><a name="l11240"></a><span class="lineno">11240</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div> -<div class="line"><a name="l11241"></a><span class="lineno">11241</span>  nextSuballocIndex < suballocations1st.size();</div> -<div class="line"><a name="l11242"></a><span class="lineno">11242</span>  nextSuballocIndex++)</div> -<div class="line"><a name="l11243"></a><span class="lineno">11243</span>  {</div> -<div class="line"><a name="l11244"></a><span class="lineno">11244</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations1st[nextSuballocIndex];</div> -<div class="line"><a name="l11245"></a><span class="lineno">11245</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> -<div class="line"><a name="l11246"></a><span class="lineno">11246</span>  {</div> -<div class="line"><a name="l11247"></a><span class="lineno">11247</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> -<div class="line"><a name="l11248"></a><span class="lineno">11248</span>  {</div> -<div class="line"><a name="l11249"></a><span class="lineno">11249</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11250"></a><span class="lineno">11250</span>  }</div> -<div class="line"><a name="l11251"></a><span class="lineno">11251</span>  }</div> -<div class="line"><a name="l11252"></a><span class="lineno">11252</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11253"></a><span class="lineno">11253</span>  {</div> -<div class="line"><a name="l11254"></a><span class="lineno">11254</span>  <span class="comment">// Already on next page.</span></div> -<div class="line"><a name="l11255"></a><span class="lineno">11255</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11256"></a><span class="lineno">11256</span>  }</div> -<div class="line"><a name="l11257"></a><span class="lineno">11257</span>  }</div> -<div class="line"><a name="l11258"></a><span class="lineno">11258</span>  }</div> -<div class="line"><a name="l11259"></a><span class="lineno">11259</span>  </div> -<div class="line"><a name="l11260"></a><span class="lineno">11260</span>  <span class="comment">// All tests passed: Success.</span></div> -<div class="line"><a name="l11261"></a><span class="lineno">11261</span>  pAllocationRequest->offset = resultOffset;</div> -<div class="line"><a name="l11262"></a><span class="lineno">11262</span>  pAllocationRequest->sumFreeSize =</div> -<div class="line"><a name="l11263"></a><span class="lineno">11263</span>  (index1st < suballocations1st.size() ? suballocations1st[index1st].offset : size)</div> -<div class="line"><a name="l11264"></a><span class="lineno">11264</span>  - resultBaseOffset</div> -<div class="line"><a name="l11265"></a><span class="lineno">11265</span>  - pAllocationRequest->sumItemSize;</div> -<div class="line"><a name="l11266"></a><span class="lineno">11266</span>  pAllocationRequest->type = VmaAllocationRequestType::EndOf2nd;</div> -<div class="line"><a name="l11267"></a><span class="lineno">11267</span>  <span class="comment">// pAllocationRequest->item, customData unused.</span></div> -<div class="line"><a name="l11268"></a><span class="lineno">11268</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11269"></a><span class="lineno">11269</span>  }</div> -<div class="line"><a name="l11270"></a><span class="lineno">11270</span>  }</div> -<div class="line"><a name="l11271"></a><span class="lineno">11271</span>  </div> -<div class="line"><a name="l11272"></a><span class="lineno">11272</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11273"></a><span class="lineno">11273</span> }</div> -<div class="line"><a name="l11274"></a><span class="lineno">11274</span>  </div> -<div class="line"><a name="l11275"></a><span class="lineno">11275</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l11276"></a><span class="lineno">11276</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l11277"></a><span class="lineno">11277</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l11278"></a><span class="lineno">11278</span>  VmaAllocationRequest* pAllocationRequest)</div> -<div class="line"><a name="l11279"></a><span class="lineno">11279</span> {</div> -<div class="line"><a name="l11280"></a><span class="lineno">11280</span>  <span class="keywordflow">if</span>(pAllocationRequest->itemsToMakeLostCount == 0)</div> -<div class="line"><a name="l11281"></a><span class="lineno">11281</span>  {</div> -<div class="line"><a name="l11282"></a><span class="lineno">11282</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11283"></a><span class="lineno">11283</span>  }</div> -<div class="line"><a name="l11284"></a><span class="lineno">11284</span>  </div> -<div class="line"><a name="l11285"></a><span class="lineno">11285</span>  VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div> -<div class="line"><a name="l11286"></a><span class="lineno">11286</span>  </div> -<div class="line"><a name="l11287"></a><span class="lineno">11287</span>  <span class="comment">// We always start from 1st.</span></div> -<div class="line"><a name="l11288"></a><span class="lineno">11288</span>  SuballocationVectorType* suballocations = &AccessSuballocations1st();</div> -<div class="line"><a name="l11289"></a><span class="lineno">11289</span>  <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11290"></a><span class="lineno">11290</span>  <span class="keywordtype">size_t</span> madeLostCount = 0;</div> -<div class="line"><a name="l11291"></a><span class="lineno">11291</span>  <span class="keywordflow">while</span>(madeLostCount < pAllocationRequest->itemsToMakeLostCount)</div> -<div class="line"><a name="l11292"></a><span class="lineno">11292</span>  {</div> -<div class="line"><a name="l11293"></a><span class="lineno">11293</span>  <span class="keywordflow">if</span>(index == suballocations->size())</div> -<div class="line"><a name="l11294"></a><span class="lineno">11294</span>  {</div> -<div class="line"><a name="l11295"></a><span class="lineno">11295</span>  index = 0;</div> -<div class="line"><a name="l11296"></a><span class="lineno">11296</span>  <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div> -<div class="line"><a name="l11297"></a><span class="lineno">11297</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l11298"></a><span class="lineno">11298</span>  {</div> -<div class="line"><a name="l11299"></a><span class="lineno">11299</span>  suballocations = &AccessSuballocations2nd();</div> -<div class="line"><a name="l11300"></a><span class="lineno">11300</span>  }</div> -<div class="line"><a name="l11301"></a><span class="lineno">11301</span>  <span class="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div> -<div class="line"><a name="l11302"></a><span class="lineno">11302</span>  <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div> -<div class="line"><a name="l11303"></a><span class="lineno">11303</span>  VMA_ASSERT(!suballocations->empty());</div> -<div class="line"><a name="l11304"></a><span class="lineno">11304</span>  }</div> -<div class="line"><a name="l11305"></a><span class="lineno">11305</span>  VmaSuballocation& suballoc = (*suballocations)[index];</div> -<div class="line"><a name="l11306"></a><span class="lineno">11306</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l11307"></a><span class="lineno">11307</span>  {</div> -<div class="line"><a name="l11308"></a><span class="lineno">11308</span>  VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div> -<div class="line"><a name="l11309"></a><span class="lineno">11309</span>  VMA_ASSERT(suballoc.hAllocation->CanBecomeLost());</div> -<div class="line"><a name="l11310"></a><span class="lineno">11310</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> -<div class="line"><a name="l11311"></a><span class="lineno">11311</span>  {</div> -<div class="line"><a name="l11312"></a><span class="lineno">11312</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11313"></a><span class="lineno">11313</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11314"></a><span class="lineno">11314</span>  m_SumFreeSize += suballoc.size;</div> -<div class="line"><a name="l11315"></a><span class="lineno">11315</span>  <span class="keywordflow">if</span>(suballocations == &AccessSuballocations1st())</div> -<div class="line"><a name="l11316"></a><span class="lineno">11316</span>  {</div> -<div class="line"><a name="l11317"></a><span class="lineno">11317</span>  ++m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11318"></a><span class="lineno">11318</span>  }</div> -<div class="line"><a name="l11319"></a><span class="lineno">11319</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11320"></a><span class="lineno">11320</span>  {</div> -<div class="line"><a name="l11321"></a><span class="lineno">11321</span>  ++m_2ndNullItemsCount;</div> -<div class="line"><a name="l11322"></a><span class="lineno">11322</span>  }</div> -<div class="line"><a name="l11323"></a><span class="lineno">11323</span>  ++madeLostCount;</div> -<div class="line"><a name="l11324"></a><span class="lineno">11324</span>  }</div> -<div class="line"><a name="l11325"></a><span class="lineno">11325</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11326"></a><span class="lineno">11326</span>  {</div> -<div class="line"><a name="l11327"></a><span class="lineno">11327</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11328"></a><span class="lineno">11328</span>  }</div> -<div class="line"><a name="l11329"></a><span class="lineno">11329</span>  }</div> -<div class="line"><a name="l11330"></a><span class="lineno">11330</span>  ++index;</div> -<div class="line"><a name="l11331"></a><span class="lineno">11331</span>  }</div> -<div class="line"><a name="l11332"></a><span class="lineno">11332</span>  </div> -<div class="line"><a name="l11333"></a><span class="lineno">11333</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11334"></a><span class="lineno">11334</span>  <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></div> -<div class="line"><a name="l11335"></a><span class="lineno">11335</span>  </div> -<div class="line"><a name="l11336"></a><span class="lineno">11336</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11337"></a><span class="lineno">11337</span> }</div> -<div class="line"><a name="l11338"></a><span class="lineno">11338</span>  </div> -<div class="line"><a name="l11339"></a><span class="lineno">11339</span> uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> -<div class="line"><a name="l11340"></a><span class="lineno">11340</span> {</div> -<div class="line"><a name="l11341"></a><span class="lineno">11341</span>  uint32_t lostAllocationCount = 0;</div> -<div class="line"><a name="l11342"></a><span class="lineno">11342</span>  </div> -<div class="line"><a name="l11343"></a><span class="lineno">11343</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11344"></a><span class="lineno">11344</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)</div> -<div class="line"><a name="l11345"></a><span class="lineno">11345</span>  {</div> -<div class="line"><a name="l11346"></a><span class="lineno">11346</span>  VmaSuballocation& suballoc = suballocations1st[i];</div> -<div class="line"><a name="l11347"></a><span class="lineno">11347</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &&</div> -<div class="line"><a name="l11348"></a><span class="lineno">11348</span>  suballoc.hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l11349"></a><span class="lineno">11349</span>  suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> -<div class="line"><a name="l11350"></a><span class="lineno">11350</span>  {</div> -<div class="line"><a name="l11351"></a><span class="lineno">11351</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11352"></a><span class="lineno">11352</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11353"></a><span class="lineno">11353</span>  ++m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11354"></a><span class="lineno">11354</span>  m_SumFreeSize += suballoc.size;</div> -<div class="line"><a name="l11355"></a><span class="lineno">11355</span>  ++lostAllocationCount;</div> -<div class="line"><a name="l11356"></a><span class="lineno">11356</span>  }</div> -<div class="line"><a name="l11357"></a><span class="lineno">11357</span>  }</div> -<div class="line"><a name="l11358"></a><span class="lineno">11358</span>  </div> -<div class="line"><a name="l11359"></a><span class="lineno">11359</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11360"></a><span class="lineno">11360</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i < count; ++i)</div> -<div class="line"><a name="l11361"></a><span class="lineno">11361</span>  {</div> -<div class="line"><a name="l11362"></a><span class="lineno">11362</span>  VmaSuballocation& suballoc = suballocations2nd[i];</div> -<div class="line"><a name="l11363"></a><span class="lineno">11363</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &&</div> -<div class="line"><a name="l11364"></a><span class="lineno">11364</span>  suballoc.hAllocation->CanBecomeLost() &&</div> -<div class="line"><a name="l11365"></a><span class="lineno">11365</span>  suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> -<div class="line"><a name="l11366"></a><span class="lineno">11366</span>  {</div> -<div class="line"><a name="l11367"></a><span class="lineno">11367</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11368"></a><span class="lineno">11368</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11369"></a><span class="lineno">11369</span>  ++m_2ndNullItemsCount;</div> -<div class="line"><a name="l11370"></a><span class="lineno">11370</span>  m_SumFreeSize += suballoc.size;</div> -<div class="line"><a name="l11371"></a><span class="lineno">11371</span>  ++lostAllocationCount;</div> -<div class="line"><a name="l11372"></a><span class="lineno">11372</span>  }</div> -<div class="line"><a name="l11373"></a><span class="lineno">11373</span>  }</div> -<div class="line"><a name="l11374"></a><span class="lineno">11374</span>  </div> -<div class="line"><a name="l11375"></a><span class="lineno">11375</span>  <span class="keywordflow">if</span>(lostAllocationCount)</div> -<div class="line"><a name="l11376"></a><span class="lineno">11376</span>  {</div> -<div class="line"><a name="l11377"></a><span class="lineno">11377</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11378"></a><span class="lineno">11378</span>  }</div> -<div class="line"><a name="l11379"></a><span class="lineno">11379</span>  </div> -<div class="line"><a name="l11380"></a><span class="lineno">11380</span>  <span class="keywordflow">return</span> lostAllocationCount;</div> -<div class="line"><a name="l11381"></a><span class="lineno">11381</span> }</div> -<div class="line"><a name="l11382"></a><span class="lineno">11382</span>  </div> -<div class="line"><a name="l11383"></a><span class="lineno">11383</span> VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div> -<div class="line"><a name="l11384"></a><span class="lineno">11384</span> {</div> -<div class="line"><a name="l11385"></a><span class="lineno">11385</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11386"></a><span class="lineno">11386</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)</div> -<div class="line"><a name="l11387"></a><span class="lineno">11387</span>  {</div> -<div class="line"><a name="l11388"></a><span class="lineno">11388</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> -<div class="line"><a name="l11389"></a><span class="lineno">11389</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l11390"></a><span class="lineno">11390</span>  {</div> -<div class="line"><a name="l11391"></a><span class="lineno">11391</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div> -<div class="line"><a name="l11392"></a><span class="lineno">11392</span>  {</div> -<div class="line"><a name="l11393"></a><span class="lineno">11393</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l11394"></a><span class="lineno">11394</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l11395"></a><span class="lineno">11395</span>  }</div> -<div class="line"><a name="l11396"></a><span class="lineno">11396</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div> -<div class="line"><a name="l11397"></a><span class="lineno">11397</span>  {</div> -<div class="line"><a name="l11398"></a><span class="lineno">11398</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l11399"></a><span class="lineno">11399</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l11400"></a><span class="lineno">11400</span>  }</div> -<div class="line"><a name="l11401"></a><span class="lineno">11401</span>  }</div> -<div class="line"><a name="l11402"></a><span class="lineno">11402</span>  }</div> -<div class="line"><a name="l11403"></a><span class="lineno">11403</span>  </div> -<div class="line"><a name="l11404"></a><span class="lineno">11404</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11405"></a><span class="lineno">11405</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i < count; ++i)</div> -<div class="line"><a name="l11406"></a><span class="lineno">11406</span>  {</div> -<div class="line"><a name="l11407"></a><span class="lineno">11407</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> -<div class="line"><a name="l11408"></a><span class="lineno">11408</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> -<div class="line"><a name="l11409"></a><span class="lineno">11409</span>  {</div> -<div class="line"><a name="l11410"></a><span class="lineno">11410</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div> +<div class="line"><a name="l11136"></a><span class="lineno">11136</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex];</div> +<div class="line"><a name="l11137"></a><span class="lineno">11137</span>  </div> +<div class="line"><a name="l11138"></a><span class="lineno">11138</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l11139"></a><span class="lineno">11139</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l11140"></a><span class="lineno">11140</span>  {</div> +<div class="line"><a name="l11141"></a><span class="lineno">11141</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l11142"></a><span class="lineno">11142</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l11143"></a><span class="lineno">11143</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11144"></a><span class="lineno">11144</span>  }</div> +<div class="line"><a name="l11145"></a><span class="lineno">11145</span>  </div> +<div class="line"><a name="l11146"></a><span class="lineno">11146</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l11147"></a><span class="lineno">11147</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l11148"></a><span class="lineno">11148</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> +<div class="line"><a name="l11149"></a><span class="lineno">11149</span>  </div> +<div class="line"><a name="l11150"></a><span class="lineno">11150</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l11151"></a><span class="lineno">11151</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l11152"></a><span class="lineno">11152</span>  ++nextAlloc1stIndex;</div> +<div class="line"><a name="l11153"></a><span class="lineno">11153</span>  }</div> +<div class="line"><a name="l11154"></a><span class="lineno">11154</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l11155"></a><span class="lineno">11155</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11156"></a><span class="lineno">11156</span>  {</div> +<div class="line"><a name="l11157"></a><span class="lineno">11157</span>  <span class="keywordflow">if</span>(lastOffset < freeSpace1stTo2ndEnd)</div> +<div class="line"><a name="l11158"></a><span class="lineno">11158</span>  {</div> +<div class="line"><a name="l11159"></a><span class="lineno">11159</span>  <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div> +<div class="line"><a name="l11160"></a><span class="lineno">11160</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div> +<div class="line"><a name="l11161"></a><span class="lineno">11161</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11162"></a><span class="lineno">11162</span>  }</div> +<div class="line"><a name="l11163"></a><span class="lineno">11163</span>  </div> +<div class="line"><a name="l11164"></a><span class="lineno">11164</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l11165"></a><span class="lineno">11165</span>  lastOffset = freeSpace1stTo2ndEnd;</div> +<div class="line"><a name="l11166"></a><span class="lineno">11166</span>  }</div> +<div class="line"><a name="l11167"></a><span class="lineno">11167</span>  }</div> +<div class="line"><a name="l11168"></a><span class="lineno">11168</span>  </div> +<div class="line"><a name="l11169"></a><span class="lineno">11169</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l11170"></a><span class="lineno">11170</span>  {</div> +<div class="line"><a name="l11171"></a><span class="lineno">11171</span>  <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div> +<div class="line"><a name="l11172"></a><span class="lineno">11172</span>  <span class="keywordflow">while</span>(lastOffset < size)</div> +<div class="line"><a name="l11173"></a><span class="lineno">11173</span>  {</div> +<div class="line"><a name="l11174"></a><span class="lineno">11174</span>  <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div> +<div class="line"><a name="l11175"></a><span class="lineno">11175</span>  <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &&</div> +<div class="line"><a name="l11176"></a><span class="lineno">11176</span>  suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l11177"></a><span class="lineno">11177</span>  {</div> +<div class="line"><a name="l11178"></a><span class="lineno">11178</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l11179"></a><span class="lineno">11179</span>  }</div> +<div class="line"><a name="l11180"></a><span class="lineno">11180</span>  </div> +<div class="line"><a name="l11181"></a><span class="lineno">11181</span>  <span class="comment">// Found non-null allocation.</span></div> +<div class="line"><a name="l11182"></a><span class="lineno">11182</span>  <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div> +<div class="line"><a name="l11183"></a><span class="lineno">11183</span>  {</div> +<div class="line"><a name="l11184"></a><span class="lineno">11184</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex];</div> +<div class="line"><a name="l11185"></a><span class="lineno">11185</span>  </div> +<div class="line"><a name="l11186"></a><span class="lineno">11186</span>  <span class="comment">// 1. Process free space before this allocation.</span></div> +<div class="line"><a name="l11187"></a><span class="lineno">11187</span>  <span class="keywordflow">if</span>(lastOffset < suballoc.offset)</div> +<div class="line"><a name="l11188"></a><span class="lineno">11188</span>  {</div> +<div class="line"><a name="l11189"></a><span class="lineno">11189</span>  <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div> +<div class="line"><a name="l11190"></a><span class="lineno">11190</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div> +<div class="line"><a name="l11191"></a><span class="lineno">11191</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11192"></a><span class="lineno">11192</span>  }</div> +<div class="line"><a name="l11193"></a><span class="lineno">11193</span>  </div> +<div class="line"><a name="l11194"></a><span class="lineno">11194</span>  <span class="comment">// 2. Process this allocation.</span></div> +<div class="line"><a name="l11195"></a><span class="lineno">11195</span>  <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div> +<div class="line"><a name="l11196"></a><span class="lineno">11196</span>  PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div> +<div class="line"><a name="l11197"></a><span class="lineno">11197</span>  </div> +<div class="line"><a name="l11198"></a><span class="lineno">11198</span>  <span class="comment">// 3. Prepare for next iteration.</span></div> +<div class="line"><a name="l11199"></a><span class="lineno">11199</span>  lastOffset = suballoc.offset + suballoc.size;</div> +<div class="line"><a name="l11200"></a><span class="lineno">11200</span>  --nextAlloc2ndIndex;</div> +<div class="line"><a name="l11201"></a><span class="lineno">11201</span>  }</div> +<div class="line"><a name="l11202"></a><span class="lineno">11202</span>  <span class="comment">// We are at the end.</span></div> +<div class="line"><a name="l11203"></a><span class="lineno">11203</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11204"></a><span class="lineno">11204</span>  {</div> +<div class="line"><a name="l11205"></a><span class="lineno">11205</span>  <span class="keywordflow">if</span>(lastOffset < size)</div> +<div class="line"><a name="l11206"></a><span class="lineno">11206</span>  {</div> +<div class="line"><a name="l11207"></a><span class="lineno">11207</span>  <span class="comment">// There is free space from lastOffset to size.</span></div> +<div class="line"><a name="l11208"></a><span class="lineno">11208</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div> +<div class="line"><a name="l11209"></a><span class="lineno">11209</span>  PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div> +<div class="line"><a name="l11210"></a><span class="lineno">11210</span>  }</div> +<div class="line"><a name="l11211"></a><span class="lineno">11211</span>  </div> +<div class="line"><a name="l11212"></a><span class="lineno">11212</span>  <span class="comment">// End of loop.</span></div> +<div class="line"><a name="l11213"></a><span class="lineno">11213</span>  lastOffset = size;</div> +<div class="line"><a name="l11214"></a><span class="lineno">11214</span>  }</div> +<div class="line"><a name="l11215"></a><span class="lineno">11215</span>  }</div> +<div class="line"><a name="l11216"></a><span class="lineno">11216</span>  }</div> +<div class="line"><a name="l11217"></a><span class="lineno">11217</span>  </div> +<div class="line"><a name="l11218"></a><span class="lineno">11218</span>  PrintDetailedMap_End(json);</div> +<div class="line"><a name="l11219"></a><span class="lineno">11219</span> }</div> +<div class="line"><a name="l11220"></a><span class="lineno">11220</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l11221"></a><span class="lineno">11221</span>  </div> +<div class="line"><a name="l11222"></a><span class="lineno">11222</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div> +<div class="line"><a name="l11223"></a><span class="lineno">11223</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l11224"></a><span class="lineno">11224</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l11225"></a><span class="lineno">11225</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l11226"></a><span class="lineno">11226</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l11227"></a><span class="lineno">11227</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l11228"></a><span class="lineno">11228</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l11229"></a><span class="lineno">11229</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l11230"></a><span class="lineno">11230</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l11231"></a><span class="lineno">11231</span>  uint32_t strategy,</div> +<div class="line"><a name="l11232"></a><span class="lineno">11232</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l11233"></a><span class="lineno">11233</span> {</div> +<div class="line"><a name="l11234"></a><span class="lineno">11234</span>  VMA_ASSERT(allocSize > 0);</div> +<div class="line"><a name="l11235"></a><span class="lineno">11235</span>  VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div> +<div class="line"><a name="l11236"></a><span class="lineno">11236</span>  VMA_ASSERT(pAllocationRequest != VMA_NULL);</div> +<div class="line"><a name="l11237"></a><span class="lineno">11237</span>  VMA_HEAVY_ASSERT(Validate());</div> +<div class="line"><a name="l11238"></a><span class="lineno">11238</span>  <span class="keywordflow">return</span> upperAddress ?</div> +<div class="line"><a name="l11239"></a><span class="lineno">11239</span>  CreateAllocationRequest_UpperAddress(</div> +<div class="line"><a name="l11240"></a><span class="lineno">11240</span>  currentFrameIndex, frameInUseCount, bufferImageGranularity,</div> +<div class="line"><a name="l11241"></a><span class="lineno">11241</span>  allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest) :</div> +<div class="line"><a name="l11242"></a><span class="lineno">11242</span>  CreateAllocationRequest_LowerAddress(</div> +<div class="line"><a name="l11243"></a><span class="lineno">11243</span>  currentFrameIndex, frameInUseCount, bufferImageGranularity,</div> +<div class="line"><a name="l11244"></a><span class="lineno">11244</span>  allocSize, allocAlignment, allocType, canMakeOtherLost, strategy, pAllocationRequest);</div> +<div class="line"><a name="l11245"></a><span class="lineno">11245</span> }</div> +<div class="line"><a name="l11246"></a><span class="lineno">11246</span>  </div> +<div class="line"><a name="l11247"></a><span class="lineno">11247</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_UpperAddress(</div> +<div class="line"><a name="l11248"></a><span class="lineno">11248</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l11249"></a><span class="lineno">11249</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l11250"></a><span class="lineno">11250</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l11251"></a><span class="lineno">11251</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l11252"></a><span class="lineno">11252</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l11253"></a><span class="lineno">11253</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l11254"></a><span class="lineno">11254</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l11255"></a><span class="lineno">11255</span>  uint32_t strategy,</div> +<div class="line"><a name="l11256"></a><span class="lineno">11256</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l11257"></a><span class="lineno">11257</span> {</div> +<div class="line"><a name="l11258"></a><span class="lineno">11258</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l11259"></a><span class="lineno">11259</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11260"></a><span class="lineno">11260</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11261"></a><span class="lineno">11261</span>  </div> +<div class="line"><a name="l11262"></a><span class="lineno">11262</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l11263"></a><span class="lineno">11263</span>  {</div> +<div class="line"><a name="l11264"></a><span class="lineno">11264</span>  VMA_ASSERT(0 && <span class="stringliteral">"Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer."</span>);</div> +<div class="line"><a name="l11265"></a><span class="lineno">11265</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11266"></a><span class="lineno">11266</span>  }</div> +<div class="line"><a name="l11267"></a><span class="lineno">11267</span>  </div> +<div class="line"><a name="l11268"></a><span class="lineno">11268</span>  <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div> +<div class="line"><a name="l11269"></a><span class="lineno">11269</span>  <span class="keywordflow">if</span>(allocSize > size)</div> +<div class="line"><a name="l11270"></a><span class="lineno">11270</span>  {</div> +<div class="line"><a name="l11271"></a><span class="lineno">11271</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11272"></a><span class="lineno">11272</span>  }</div> +<div class="line"><a name="l11273"></a><span class="lineno">11273</span>  VkDeviceSize resultBaseOffset = size - allocSize;</div> +<div class="line"><a name="l11274"></a><span class="lineno">11274</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> +<div class="line"><a name="l11275"></a><span class="lineno">11275</span>  {</div> +<div class="line"><a name="l11276"></a><span class="lineno">11276</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> +<div class="line"><a name="l11277"></a><span class="lineno">11277</span>  resultBaseOffset = lastSuballoc.offset - allocSize;</div> +<div class="line"><a name="l11278"></a><span class="lineno">11278</span>  <span class="keywordflow">if</span>(allocSize > lastSuballoc.offset)</div> +<div class="line"><a name="l11279"></a><span class="lineno">11279</span>  {</div> +<div class="line"><a name="l11280"></a><span class="lineno">11280</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11281"></a><span class="lineno">11281</span>  }</div> +<div class="line"><a name="l11282"></a><span class="lineno">11282</span>  }</div> +<div class="line"><a name="l11283"></a><span class="lineno">11283</span>  </div> +<div class="line"><a name="l11284"></a><span class="lineno">11284</span>  <span class="comment">// Start from offset equal to end of free space.</span></div> +<div class="line"><a name="l11285"></a><span class="lineno">11285</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> +<div class="line"><a name="l11286"></a><span class="lineno">11286</span>  </div> +<div class="line"><a name="l11287"></a><span class="lineno">11287</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div> +<div class="line"><a name="l11288"></a><span class="lineno">11288</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> +<div class="line"><a name="l11289"></a><span class="lineno">11289</span>  {</div> +<div class="line"><a name="l11290"></a><span class="lineno">11290</span>  <span class="keywordflow">if</span>(resultOffset < VMA_DEBUG_MARGIN)</div> +<div class="line"><a name="l11291"></a><span class="lineno">11291</span>  {</div> +<div class="line"><a name="l11292"></a><span class="lineno">11292</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11293"></a><span class="lineno">11293</span>  }</div> +<div class="line"><a name="l11294"></a><span class="lineno">11294</span>  resultOffset -= VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l11295"></a><span class="lineno">11295</span>  }</div> +<div class="line"><a name="l11296"></a><span class="lineno">11296</span>  </div> +<div class="line"><a name="l11297"></a><span class="lineno">11297</span>  <span class="comment">// Apply alignment.</span></div> +<div class="line"><a name="l11298"></a><span class="lineno">11298</span>  resultOffset = VmaAlignDown(resultOffset, allocAlignment);</div> +<div class="line"><a name="l11299"></a><span class="lineno">11299</span>  </div> +<div class="line"><a name="l11300"></a><span class="lineno">11300</span>  <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11301"></a><span class="lineno">11301</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> +<div class="line"><a name="l11302"></a><span class="lineno">11302</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())</div> +<div class="line"><a name="l11303"></a><span class="lineno">11303</span>  {</div> +<div class="line"><a name="l11304"></a><span class="lineno">11304</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> +<div class="line"><a name="l11305"></a><span class="lineno">11305</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div> +<div class="line"><a name="l11306"></a><span class="lineno">11306</span>  {</div> +<div class="line"><a name="l11307"></a><span class="lineno">11307</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];</div> +<div class="line"><a name="l11308"></a><span class="lineno">11308</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l11309"></a><span class="lineno">11309</span>  {</div> +<div class="line"><a name="l11310"></a><span class="lineno">11310</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div> +<div class="line"><a name="l11311"></a><span class="lineno">11311</span>  {</div> +<div class="line"><a name="l11312"></a><span class="lineno">11312</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> +<div class="line"><a name="l11313"></a><span class="lineno">11313</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11314"></a><span class="lineno">11314</span>  }</div> +<div class="line"><a name="l11315"></a><span class="lineno">11315</span>  }</div> +<div class="line"><a name="l11316"></a><span class="lineno">11316</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11317"></a><span class="lineno">11317</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l11318"></a><span class="lineno">11318</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11319"></a><span class="lineno">11319</span>  }</div> +<div class="line"><a name="l11320"></a><span class="lineno">11320</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> +<div class="line"><a name="l11321"></a><span class="lineno">11321</span>  {</div> +<div class="line"><a name="l11322"></a><span class="lineno">11322</span>  resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div> +<div class="line"><a name="l11323"></a><span class="lineno">11323</span>  }</div> +<div class="line"><a name="l11324"></a><span class="lineno">11324</span>  }</div> +<div class="line"><a name="l11325"></a><span class="lineno">11325</span>  </div> +<div class="line"><a name="l11326"></a><span class="lineno">11326</span>  <span class="comment">// There is enough free space.</span></div> +<div class="line"><a name="l11327"></a><span class="lineno">11327</span>  <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div> +<div class="line"><a name="l11328"></a><span class="lineno">11328</span>  suballocations1st.back().offset + suballocations1st.back().size :</div> +<div class="line"><a name="l11329"></a><span class="lineno">11329</span>  0;</div> +<div class="line"><a name="l11330"></a><span class="lineno">11330</span>  <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN <= resultOffset)</div> +<div class="line"><a name="l11331"></a><span class="lineno">11331</span>  {</div> +<div class="line"><a name="l11332"></a><span class="lineno">11332</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11333"></a><span class="lineno">11333</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> +<div class="line"><a name="l11334"></a><span class="lineno">11334</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1)</div> +<div class="line"><a name="l11335"></a><span class="lineno">11335</span>  {</div> +<div class="line"><a name="l11336"></a><span class="lineno">11336</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div> +<div class="line"><a name="l11337"></a><span class="lineno">11337</span>  {</div> +<div class="line"><a name="l11338"></a><span class="lineno">11338</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];</div> +<div class="line"><a name="l11339"></a><span class="lineno">11339</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> +<div class="line"><a name="l11340"></a><span class="lineno">11340</span>  {</div> +<div class="line"><a name="l11341"></a><span class="lineno">11341</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</div> +<div class="line"><a name="l11342"></a><span class="lineno">11342</span>  {</div> +<div class="line"><a name="l11343"></a><span class="lineno">11343</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11344"></a><span class="lineno">11344</span>  }</div> +<div class="line"><a name="l11345"></a><span class="lineno">11345</span>  }</div> +<div class="line"><a name="l11346"></a><span class="lineno">11346</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11347"></a><span class="lineno">11347</span>  {</div> +<div class="line"><a name="l11348"></a><span class="lineno">11348</span>  <span class="comment">// Already on next page.</span></div> +<div class="line"><a name="l11349"></a><span class="lineno">11349</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11350"></a><span class="lineno">11350</span>  }</div> +<div class="line"><a name="l11351"></a><span class="lineno">11351</span>  }</div> +<div class="line"><a name="l11352"></a><span class="lineno">11352</span>  }</div> +<div class="line"><a name="l11353"></a><span class="lineno">11353</span>  </div> +<div class="line"><a name="l11354"></a><span class="lineno">11354</span>  <span class="comment">// All tests passed: Success.</span></div> +<div class="line"><a name="l11355"></a><span class="lineno">11355</span>  pAllocationRequest->offset = resultOffset;</div> +<div class="line"><a name="l11356"></a><span class="lineno">11356</span>  pAllocationRequest->sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div> +<div class="line"><a name="l11357"></a><span class="lineno">11357</span>  pAllocationRequest->sumItemSize = 0;</div> +<div class="line"><a name="l11358"></a><span class="lineno">11358</span>  <span class="comment">// pAllocationRequest->item unused.</span></div> +<div class="line"><a name="l11359"></a><span class="lineno">11359</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> +<div class="line"><a name="l11360"></a><span class="lineno">11360</span>  pAllocationRequest->type = VmaAllocationRequestType::UpperAddress;</div> +<div class="line"><a name="l11361"></a><span class="lineno">11361</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l11362"></a><span class="lineno">11362</span>  }</div> +<div class="line"><a name="l11363"></a><span class="lineno">11363</span>  </div> +<div class="line"><a name="l11364"></a><span class="lineno">11364</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11365"></a><span class="lineno">11365</span> }</div> +<div class="line"><a name="l11366"></a><span class="lineno">11366</span>  </div> +<div class="line"><a name="l11367"></a><span class="lineno">11367</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest_LowerAddress(</div> +<div class="line"><a name="l11368"></a><span class="lineno">11368</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l11369"></a><span class="lineno">11369</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l11370"></a><span class="lineno">11370</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l11371"></a><span class="lineno">11371</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l11372"></a><span class="lineno">11372</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l11373"></a><span class="lineno">11373</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l11374"></a><span class="lineno">11374</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l11375"></a><span class="lineno">11375</span>  uint32_t strategy,</div> +<div class="line"><a name="l11376"></a><span class="lineno">11376</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l11377"></a><span class="lineno">11377</span> {</div> +<div class="line"><a name="l11378"></a><span class="lineno">11378</span>  <span class="keyword">const</span> VkDeviceSize size = GetSize();</div> +<div class="line"><a name="l11379"></a><span class="lineno">11379</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11380"></a><span class="lineno">11380</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11381"></a><span class="lineno">11381</span>  </div> +<div class="line"><a name="l11382"></a><span class="lineno">11382</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l11383"></a><span class="lineno">11383</span>  {</div> +<div class="line"><a name="l11384"></a><span class="lineno">11384</span>  <span class="comment">// Try to allocate at the end of 1st vector.</span></div> +<div class="line"><a name="l11385"></a><span class="lineno">11385</span>  </div> +<div class="line"><a name="l11386"></a><span class="lineno">11386</span>  VkDeviceSize resultBaseOffset = 0;</div> +<div class="line"><a name="l11387"></a><span class="lineno">11387</span>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> +<div class="line"><a name="l11388"></a><span class="lineno">11388</span>  {</div> +<div class="line"><a name="l11389"></a><span class="lineno">11389</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations1st.back();</div> +<div class="line"><a name="l11390"></a><span class="lineno">11390</span>  resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div> +<div class="line"><a name="l11391"></a><span class="lineno">11391</span>  }</div> +<div class="line"><a name="l11392"></a><span class="lineno">11392</span>  </div> +<div class="line"><a name="l11393"></a><span class="lineno">11393</span>  <span class="comment">// Start from offset equal to beginning of free space.</span></div> +<div class="line"><a name="l11394"></a><span class="lineno">11394</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> +<div class="line"><a name="l11395"></a><span class="lineno">11395</span>  </div> +<div class="line"><a name="l11396"></a><span class="lineno">11396</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> +<div class="line"><a name="l11397"></a><span class="lineno">11397</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> +<div class="line"><a name="l11398"></a><span class="lineno">11398</span>  {</div> +<div class="line"><a name="l11399"></a><span class="lineno">11399</span>  resultOffset += VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l11400"></a><span class="lineno">11400</span>  }</div> +<div class="line"><a name="l11401"></a><span class="lineno">11401</span>  </div> +<div class="line"><a name="l11402"></a><span class="lineno">11402</span>  <span class="comment">// Apply alignment.</span></div> +<div class="line"><a name="l11403"></a><span class="lineno">11403</span>  resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div> +<div class="line"><a name="l11404"></a><span class="lineno">11404</span>  </div> +<div class="line"><a name="l11405"></a><span class="lineno">11405</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11406"></a><span class="lineno">11406</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> +<div class="line"><a name="l11407"></a><span class="lineno">11407</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations1st.empty())</div> +<div class="line"><a name="l11408"></a><span class="lineno">11408</span>  {</div> +<div class="line"><a name="l11409"></a><span class="lineno">11409</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> +<div class="line"><a name="l11410"></a><span class="lineno">11410</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div> <div class="line"><a name="l11411"></a><span class="lineno">11411</span>  {</div> -<div class="line"><a name="l11412"></a><span class="lineno">11412</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l11413"></a><span class="lineno">11413</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l11414"></a><span class="lineno">11414</span>  }</div> -<div class="line"><a name="l11415"></a><span class="lineno">11415</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div> -<div class="line"><a name="l11416"></a><span class="lineno">11416</span>  {</div> -<div class="line"><a name="l11417"></a><span class="lineno">11417</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> -<div class="line"><a name="l11418"></a><span class="lineno">11418</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> -<div class="line"><a name="l11419"></a><span class="lineno">11419</span>  }</div> -<div class="line"><a name="l11420"></a><span class="lineno">11420</span>  }</div> -<div class="line"><a name="l11421"></a><span class="lineno">11421</span>  }</div> -<div class="line"><a name="l11422"></a><span class="lineno">11422</span>  </div> -<div class="line"><a name="l11423"></a><span class="lineno">11423</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> -<div class="line"><a name="l11424"></a><span class="lineno">11424</span> }</div> -<div class="line"><a name="l11425"></a><span class="lineno">11425</span>  </div> -<div class="line"><a name="l11426"></a><span class="lineno">11426</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div> -<div class="line"><a name="l11427"></a><span class="lineno">11427</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l11428"></a><span class="lineno">11428</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l11429"></a><span class="lineno">11429</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l11430"></a><span class="lineno">11430</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div> -<div class="line"><a name="l11431"></a><span class="lineno">11431</span> {</div> -<div class="line"><a name="l11432"></a><span class="lineno">11432</span>  <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div> +<div class="line"><a name="l11412"></a><span class="lineno">11412</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations1st[prevSuballocIndex];</div> +<div class="line"><a name="l11413"></a><span class="lineno">11413</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> +<div class="line"><a name="l11414"></a><span class="lineno">11414</span>  {</div> +<div class="line"><a name="l11415"></a><span class="lineno">11415</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> +<div class="line"><a name="l11416"></a><span class="lineno">11416</span>  {</div> +<div class="line"><a name="l11417"></a><span class="lineno">11417</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> +<div class="line"><a name="l11418"></a><span class="lineno">11418</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11419"></a><span class="lineno">11419</span>  }</div> +<div class="line"><a name="l11420"></a><span class="lineno">11420</span>  }</div> +<div class="line"><a name="l11421"></a><span class="lineno">11421</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11422"></a><span class="lineno">11422</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l11423"></a><span class="lineno">11423</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11424"></a><span class="lineno">11424</span>  }</div> +<div class="line"><a name="l11425"></a><span class="lineno">11425</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> +<div class="line"><a name="l11426"></a><span class="lineno">11426</span>  {</div> +<div class="line"><a name="l11427"></a><span class="lineno">11427</span>  resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div> +<div class="line"><a name="l11428"></a><span class="lineno">11428</span>  }</div> +<div class="line"><a name="l11429"></a><span class="lineno">11429</span>  }</div> +<div class="line"><a name="l11430"></a><span class="lineno">11430</span>  </div> +<div class="line"><a name="l11431"></a><span class="lineno">11431</span>  <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div> +<div class="line"><a name="l11432"></a><span class="lineno">11432</span>  suballocations2nd.back().offset : size;</div> <div class="line"><a name="l11433"></a><span class="lineno">11433</span>  </div> -<div class="line"><a name="l11434"></a><span class="lineno">11434</span>  <span class="keywordflow">switch</span>(request.type)</div> -<div class="line"><a name="l11435"></a><span class="lineno">11435</span>  {</div> -<div class="line"><a name="l11436"></a><span class="lineno">11436</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::UpperAddress:</div> -<div class="line"><a name="l11437"></a><span class="lineno">11437</span>  {</div> -<div class="line"><a name="l11438"></a><span class="lineno">11438</span>  VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &&</div> -<div class="line"><a name="l11439"></a><span class="lineno">11439</span>  <span class="stringliteral">"CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer."</span>);</div> -<div class="line"><a name="l11440"></a><span class="lineno">11440</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11441"></a><span class="lineno">11441</span>  suballocations2nd.push_back(newSuballoc);</div> -<div class="line"><a name="l11442"></a><span class="lineno">11442</span>  m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div> -<div class="line"><a name="l11443"></a><span class="lineno">11443</span>  }</div> -<div class="line"><a name="l11444"></a><span class="lineno">11444</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11445"></a><span class="lineno">11445</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div> -<div class="line"><a name="l11446"></a><span class="lineno">11446</span>  {</div> -<div class="line"><a name="l11447"></a><span class="lineno">11447</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11448"></a><span class="lineno">11448</span>  </div> -<div class="line"><a name="l11449"></a><span class="lineno">11449</span>  VMA_ASSERT(suballocations1st.empty() ||</div> -<div class="line"><a name="l11450"></a><span class="lineno">11450</span>  request.offset >= suballocations1st.back().offset + suballocations1st.back().size);</div> -<div class="line"><a name="l11451"></a><span class="lineno">11451</span>  <span class="comment">// Check if it fits before the end of the block.</span></div> -<div class="line"><a name="l11452"></a><span class="lineno">11452</span>  VMA_ASSERT(request.offset + allocSize <= GetSize());</div> -<div class="line"><a name="l11453"></a><span class="lineno">11453</span>  </div> -<div class="line"><a name="l11454"></a><span class="lineno">11454</span>  suballocations1st.push_back(newSuballoc);</div> -<div class="line"><a name="l11455"></a><span class="lineno">11455</span>  }</div> -<div class="line"><a name="l11456"></a><span class="lineno">11456</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11457"></a><span class="lineno">11457</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</div> -<div class="line"><a name="l11458"></a><span class="lineno">11458</span>  {</div> -<div class="line"><a name="l11459"></a><span class="lineno">11459</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11460"></a><span class="lineno">11460</span>  <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div> -<div class="line"><a name="l11461"></a><span class="lineno">11461</span>  VMA_ASSERT(!suballocations1st.empty() &&</div> -<div class="line"><a name="l11462"></a><span class="lineno">11462</span>  request.offset + allocSize <= suballocations1st[m_1stNullItemsBeginCount].offset);</div> -<div class="line"><a name="l11463"></a><span class="lineno">11463</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11464"></a><span class="lineno">11464</span>  </div> -<div class="line"><a name="l11465"></a><span class="lineno">11465</span>  <span class="keywordflow">switch</span>(m_2ndVectorMode)</div> -<div class="line"><a name="l11466"></a><span class="lineno">11466</span>  {</div> -<div class="line"><a name="l11467"></a><span class="lineno">11467</span>  <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div> -<div class="line"><a name="l11468"></a><span class="lineno">11468</span>  <span class="comment">// First allocation from second part ring buffer.</span></div> -<div class="line"><a name="l11469"></a><span class="lineno">11469</span>  VMA_ASSERT(suballocations2nd.empty());</div> -<div class="line"><a name="l11470"></a><span class="lineno">11470</span>  m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div> -<div class="line"><a name="l11471"></a><span class="lineno">11471</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11472"></a><span class="lineno">11472</span>  <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div> -<div class="line"><a name="l11473"></a><span class="lineno">11473</span>  <span class="comment">// 2-part ring buffer is already started.</span></div> -<div class="line"><a name="l11474"></a><span class="lineno">11474</span>  VMA_ASSERT(!suballocations2nd.empty());</div> -<div class="line"><a name="l11475"></a><span class="lineno">11475</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11476"></a><span class="lineno">11476</span>  <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div> -<div class="line"><a name="l11477"></a><span class="lineno">11477</span>  VMA_ASSERT(0 && <span class="stringliteral">"CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack."</span>);</div> -<div class="line"><a name="l11478"></a><span class="lineno">11478</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11479"></a><span class="lineno">11479</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l11480"></a><span class="lineno">11480</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l11481"></a><span class="lineno">11481</span>  }</div> +<div class="line"><a name="l11434"></a><span class="lineno">11434</span>  <span class="comment">// There is enough free space at the end after alignment.</span></div> +<div class="line"><a name="l11435"></a><span class="lineno">11435</span>  <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN <= freeSpaceEnd)</div> +<div class="line"><a name="l11436"></a><span class="lineno">11436</span>  {</div> +<div class="line"><a name="l11437"></a><span class="lineno">11437</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11438"></a><span class="lineno">11438</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> +<div class="line"><a name="l11439"></a><span class="lineno">11439</span>  <span class="keywordflow">if</span>((allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity) && m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> +<div class="line"><a name="l11440"></a><span class="lineno">11440</span>  {</div> +<div class="line"><a name="l11441"></a><span class="lineno">11441</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div> +<div class="line"><a name="l11442"></a><span class="lineno">11442</span>  {</div> +<div class="line"><a name="l11443"></a><span class="lineno">11443</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations2nd[nextSuballocIndex];</div> +<div class="line"><a name="l11444"></a><span class="lineno">11444</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l11445"></a><span class="lineno">11445</span>  {</div> +<div class="line"><a name="l11446"></a><span class="lineno">11446</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> +<div class="line"><a name="l11447"></a><span class="lineno">11447</span>  {</div> +<div class="line"><a name="l11448"></a><span class="lineno">11448</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11449"></a><span class="lineno">11449</span>  }</div> +<div class="line"><a name="l11450"></a><span class="lineno">11450</span>  }</div> +<div class="line"><a name="l11451"></a><span class="lineno">11451</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11452"></a><span class="lineno">11452</span>  {</div> +<div class="line"><a name="l11453"></a><span class="lineno">11453</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l11454"></a><span class="lineno">11454</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11455"></a><span class="lineno">11455</span>  }</div> +<div class="line"><a name="l11456"></a><span class="lineno">11456</span>  }</div> +<div class="line"><a name="l11457"></a><span class="lineno">11457</span>  }</div> +<div class="line"><a name="l11458"></a><span class="lineno">11458</span>  </div> +<div class="line"><a name="l11459"></a><span class="lineno">11459</span>  <span class="comment">// All tests passed: Success.</span></div> +<div class="line"><a name="l11460"></a><span class="lineno">11460</span>  pAllocationRequest->offset = resultOffset;</div> +<div class="line"><a name="l11461"></a><span class="lineno">11461</span>  pAllocationRequest->sumFreeSize = freeSpaceEnd - resultBaseOffset;</div> +<div class="line"><a name="l11462"></a><span class="lineno">11462</span>  pAllocationRequest->sumItemSize = 0;</div> +<div class="line"><a name="l11463"></a><span class="lineno">11463</span>  <span class="comment">// pAllocationRequest->item, customData unused.</span></div> +<div class="line"><a name="l11464"></a><span class="lineno">11464</span>  pAllocationRequest->type = VmaAllocationRequestType::EndOf1st;</div> +<div class="line"><a name="l11465"></a><span class="lineno">11465</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> +<div class="line"><a name="l11466"></a><span class="lineno">11466</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l11467"></a><span class="lineno">11467</span>  }</div> +<div class="line"><a name="l11468"></a><span class="lineno">11468</span>  }</div> +<div class="line"><a name="l11469"></a><span class="lineno">11469</span>  </div> +<div class="line"><a name="l11470"></a><span class="lineno">11470</span>  <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div> +<div class="line"><a name="l11471"></a><span class="lineno">11471</span>  <span class="comment">// beginning of 1st vector as the end of free space.</span></div> +<div class="line"><a name="l11472"></a><span class="lineno">11472</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l11473"></a><span class="lineno">11473</span>  {</div> +<div class="line"><a name="l11474"></a><span class="lineno">11474</span>  VMA_ASSERT(!suballocations1st.empty());</div> +<div class="line"><a name="l11475"></a><span class="lineno">11475</span>  </div> +<div class="line"><a name="l11476"></a><span class="lineno">11476</span>  VkDeviceSize resultBaseOffset = 0;</div> +<div class="line"><a name="l11477"></a><span class="lineno">11477</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty())</div> +<div class="line"><a name="l11478"></a><span class="lineno">11478</span>  {</div> +<div class="line"><a name="l11479"></a><span class="lineno">11479</span>  <span class="keyword">const</span> VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> +<div class="line"><a name="l11480"></a><span class="lineno">11480</span>  resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div> +<div class="line"><a name="l11481"></a><span class="lineno">11481</span>  }</div> <div class="line"><a name="l11482"></a><span class="lineno">11482</span>  </div> -<div class="line"><a name="l11483"></a><span class="lineno">11483</span>  suballocations2nd.push_back(newSuballoc);</div> -<div class="line"><a name="l11484"></a><span class="lineno">11484</span>  }</div> -<div class="line"><a name="l11485"></a><span class="lineno">11485</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l11486"></a><span class="lineno">11486</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l11487"></a><span class="lineno">11487</span>  VMA_ASSERT(0 && <span class="stringliteral">"CRITICAL INTERNAL ERROR."</span>);</div> -<div class="line"><a name="l11488"></a><span class="lineno">11488</span>  }</div> -<div class="line"><a name="l11489"></a><span class="lineno">11489</span>  </div> -<div class="line"><a name="l11490"></a><span class="lineno">11490</span>  m_SumFreeSize -= newSuballoc.size;</div> -<div class="line"><a name="l11491"></a><span class="lineno">11491</span> }</div> -<div class="line"><a name="l11492"></a><span class="lineno">11492</span>  </div> -<div class="line"><a name="l11493"></a><span class="lineno">11493</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div> -<div class="line"><a name="l11494"></a><span class="lineno">11494</span> {</div> -<div class="line"><a name="l11495"></a><span class="lineno">11495</span>  FreeAtOffset(allocation->GetOffset());</div> -<div class="line"><a name="l11496"></a><span class="lineno">11496</span> }</div> -<div class="line"><a name="l11497"></a><span class="lineno">11497</span>  </div> -<div class="line"><a name="l11498"></a><span class="lineno">11498</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div> -<div class="line"><a name="l11499"></a><span class="lineno">11499</span> {</div> -<div class="line"><a name="l11500"></a><span class="lineno">11500</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11501"></a><span class="lineno">11501</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11502"></a><span class="lineno">11502</span>  </div> -<div class="line"><a name="l11503"></a><span class="lineno">11503</span>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> -<div class="line"><a name="l11504"></a><span class="lineno">11504</span>  {</div> -<div class="line"><a name="l11505"></a><span class="lineno">11505</span>  <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div> -<div class="line"><a name="l11506"></a><span class="lineno">11506</span>  VmaSuballocation& firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div> -<div class="line"><a name="l11507"></a><span class="lineno">11507</span>  <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</div> -<div class="line"><a name="l11508"></a><span class="lineno">11508</span>  {</div> -<div class="line"><a name="l11509"></a><span class="lineno">11509</span>  firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11510"></a><span class="lineno">11510</span>  firstSuballoc.hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11511"></a><span class="lineno">11511</span>  m_SumFreeSize += firstSuballoc.size;</div> -<div class="line"><a name="l11512"></a><span class="lineno">11512</span>  ++m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11513"></a><span class="lineno">11513</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11514"></a><span class="lineno">11514</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l11515"></a><span class="lineno">11515</span>  }</div> -<div class="line"><a name="l11516"></a><span class="lineno">11516</span>  }</div> -<div class="line"><a name="l11517"></a><span class="lineno">11517</span>  </div> -<div class="line"><a name="l11518"></a><span class="lineno">11518</span>  <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div> -<div class="line"><a name="l11519"></a><span class="lineno">11519</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div> -<div class="line"><a name="l11520"></a><span class="lineno">11520</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div> -<div class="line"><a name="l11521"></a><span class="lineno">11521</span>  {</div> -<div class="line"><a name="l11522"></a><span class="lineno">11522</span>  VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> -<div class="line"><a name="l11523"></a><span class="lineno">11523</span>  <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div> -<div class="line"><a name="l11524"></a><span class="lineno">11524</span>  {</div> -<div class="line"><a name="l11525"></a><span class="lineno">11525</span>  m_SumFreeSize += lastSuballoc.size;</div> -<div class="line"><a name="l11526"></a><span class="lineno">11526</span>  suballocations2nd.pop_back();</div> -<div class="line"><a name="l11527"></a><span class="lineno">11527</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11528"></a><span class="lineno">11528</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l11529"></a><span class="lineno">11529</span>  }</div> -<div class="line"><a name="l11530"></a><span class="lineno">11530</span>  }</div> -<div class="line"><a name="l11531"></a><span class="lineno">11531</span>  <span class="comment">// Last allocation in 1st vector.</span></div> -<div class="line"><a name="l11532"></a><span class="lineno">11532</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</div> -<div class="line"><a name="l11533"></a><span class="lineno">11533</span>  {</div> -<div class="line"><a name="l11534"></a><span class="lineno">11534</span>  VmaSuballocation& lastSuballoc = suballocations1st.back();</div> -<div class="line"><a name="l11535"></a><span class="lineno">11535</span>  <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div> -<div class="line"><a name="l11536"></a><span class="lineno">11536</span>  {</div> -<div class="line"><a name="l11537"></a><span class="lineno">11537</span>  m_SumFreeSize += lastSuballoc.size;</div> -<div class="line"><a name="l11538"></a><span class="lineno">11538</span>  suballocations1st.pop_back();</div> -<div class="line"><a name="l11539"></a><span class="lineno">11539</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11540"></a><span class="lineno">11540</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l11541"></a><span class="lineno">11541</span>  }</div> -<div class="line"><a name="l11542"></a><span class="lineno">11542</span>  }</div> -<div class="line"><a name="l11543"></a><span class="lineno">11543</span>  </div> -<div class="line"><a name="l11544"></a><span class="lineno">11544</span>  <span class="comment">// Item from the middle of 1st vector.</span></div> -<div class="line"><a name="l11545"></a><span class="lineno">11545</span>  {</div> -<div class="line"><a name="l11546"></a><span class="lineno">11546</span>  VmaSuballocation refSuballoc;</div> -<div class="line"><a name="l11547"></a><span class="lineno">11547</span>  refSuballoc.offset = offset;</div> -<div class="line"><a name="l11548"></a><span class="lineno">11548</span>  <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div> -<div class="line"><a name="l11549"></a><span class="lineno">11549</span>  SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div> -<div class="line"><a name="l11550"></a><span class="lineno">11550</span>  suballocations1st.begin() + m_1stNullItemsBeginCount,</div> -<div class="line"><a name="l11551"></a><span class="lineno">11551</span>  suballocations1st.end(),</div> -<div class="line"><a name="l11552"></a><span class="lineno">11552</span>  refSuballoc,</div> -<div class="line"><a name="l11553"></a><span class="lineno">11553</span>  VmaSuballocationOffsetLess());</div> -<div class="line"><a name="l11554"></a><span class="lineno">11554</span>  <span class="keywordflow">if</span>(it != suballocations1st.end())</div> -<div class="line"><a name="l11555"></a><span class="lineno">11555</span>  {</div> -<div class="line"><a name="l11556"></a><span class="lineno">11556</span>  it->type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11557"></a><span class="lineno">11557</span>  it->hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11558"></a><span class="lineno">11558</span>  ++m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11559"></a><span class="lineno">11559</span>  m_SumFreeSize += it->size;</div> -<div class="line"><a name="l11560"></a><span class="lineno">11560</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11561"></a><span class="lineno">11561</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l11562"></a><span class="lineno">11562</span>  }</div> -<div class="line"><a name="l11563"></a><span class="lineno">11563</span>  }</div> -<div class="line"><a name="l11564"></a><span class="lineno">11564</span>  </div> -<div class="line"><a name="l11565"></a><span class="lineno">11565</span>  <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</div> -<div class="line"><a name="l11566"></a><span class="lineno">11566</span>  {</div> -<div class="line"><a name="l11567"></a><span class="lineno">11567</span>  <span class="comment">// Item from the middle of 2nd vector.</span></div> -<div class="line"><a name="l11568"></a><span class="lineno">11568</span>  VmaSuballocation refSuballoc;</div> -<div class="line"><a name="l11569"></a><span class="lineno">11569</span>  refSuballoc.offset = offset;</div> -<div class="line"><a name="l11570"></a><span class="lineno">11570</span>  <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div> -<div class="line"><a name="l11571"></a><span class="lineno">11571</span>  SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div> -<div class="line"><a name="l11572"></a><span class="lineno">11572</span>  VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div> -<div class="line"><a name="l11573"></a><span class="lineno">11573</span>  VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div> -<div class="line"><a name="l11574"></a><span class="lineno">11574</span>  <span class="keywordflow">if</span>(it != suballocations2nd.end())</div> -<div class="line"><a name="l11575"></a><span class="lineno">11575</span>  {</div> -<div class="line"><a name="l11576"></a><span class="lineno">11576</span>  it->type = VMA_SUBALLOCATION_TYPE_FREE;</div> -<div class="line"><a name="l11577"></a><span class="lineno">11577</span>  it->hAllocation = VK_NULL_HANDLE;</div> -<div class="line"><a name="l11578"></a><span class="lineno">11578</span>  ++m_2ndNullItemsCount;</div> -<div class="line"><a name="l11579"></a><span class="lineno">11579</span>  m_SumFreeSize += it->size;</div> -<div class="line"><a name="l11580"></a><span class="lineno">11580</span>  CleanupAfterFree();</div> -<div class="line"><a name="l11581"></a><span class="lineno">11581</span>  <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l11582"></a><span class="lineno">11582</span>  }</div> -<div class="line"><a name="l11583"></a><span class="lineno">11583</span>  }</div> -<div class="line"><a name="l11584"></a><span class="lineno">11584</span>  </div> -<div class="line"><a name="l11585"></a><span class="lineno">11585</span>  VMA_ASSERT(0 && <span class="stringliteral">"Allocation to free not found in linear allocator!"</span>);</div> -<div class="line"><a name="l11586"></a><span class="lineno">11586</span> }</div> -<div class="line"><a name="l11587"></a><span class="lineno">11587</span>  </div> -<div class="line"><a name="l11588"></a><span class="lineno">11588</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div> -<div class="line"><a name="l11589"></a><span class="lineno">11589</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11590"></a><span class="lineno">11590</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11591"></a><span class="lineno">11591</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div> -<div class="line"><a name="l11592"></a><span class="lineno">11592</span>  <span class="keywordflow">return</span> suballocCount > 32 && nullItemCount * 2 >= (suballocCount - nullItemCount) * 3;</div> -<div class="line"><a name="l11593"></a><span class="lineno">11593</span> }</div> +<div class="line"><a name="l11483"></a><span class="lineno">11483</span>  <span class="comment">// Start from offset equal to beginning of free space.</span></div> +<div class="line"><a name="l11484"></a><span class="lineno">11484</span>  VkDeviceSize resultOffset = resultBaseOffset;</div> +<div class="line"><a name="l11485"></a><span class="lineno">11485</span>  </div> +<div class="line"><a name="l11486"></a><span class="lineno">11486</span>  <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div> +<div class="line"><a name="l11487"></a><span class="lineno">11487</span>  <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN > 0)</div> +<div class="line"><a name="l11488"></a><span class="lineno">11488</span>  {</div> +<div class="line"><a name="l11489"></a><span class="lineno">11489</span>  resultOffset += VMA_DEBUG_MARGIN;</div> +<div class="line"><a name="l11490"></a><span class="lineno">11490</span>  }</div> +<div class="line"><a name="l11491"></a><span class="lineno">11491</span>  </div> +<div class="line"><a name="l11492"></a><span class="lineno">11492</span>  <span class="comment">// Apply alignment.</span></div> +<div class="line"><a name="l11493"></a><span class="lineno">11493</span>  resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div> +<div class="line"><a name="l11494"></a><span class="lineno">11494</span>  </div> +<div class="line"><a name="l11495"></a><span class="lineno">11495</span>  <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11496"></a><span class="lineno">11496</span>  <span class="comment">// Make bigger alignment if necessary.</span></div> +<div class="line"><a name="l11497"></a><span class="lineno">11497</span>  <span class="keywordflow">if</span>(bufferImageGranularity > 1 && bufferImageGranularity != allocAlignment && !suballocations2nd.empty())</div> +<div class="line"><a name="l11498"></a><span class="lineno">11498</span>  {</div> +<div class="line"><a name="l11499"></a><span class="lineno">11499</span>  <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div> +<div class="line"><a name="l11500"></a><span class="lineno">11500</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</div> +<div class="line"><a name="l11501"></a><span class="lineno">11501</span>  {</div> +<div class="line"><a name="l11502"></a><span class="lineno">11502</span>  <span class="keyword">const</span> VmaSuballocation& prevSuballoc = suballocations2nd[prevSuballocIndex];</div> +<div class="line"><a name="l11503"></a><span class="lineno">11503</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div> +<div class="line"><a name="l11504"></a><span class="lineno">11504</span>  {</div> +<div class="line"><a name="l11505"></a><span class="lineno">11505</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div> +<div class="line"><a name="l11506"></a><span class="lineno">11506</span>  {</div> +<div class="line"><a name="l11507"></a><span class="lineno">11507</span>  bufferImageGranularityConflict = <span class="keyword">true</span>;</div> +<div class="line"><a name="l11508"></a><span class="lineno">11508</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11509"></a><span class="lineno">11509</span>  }</div> +<div class="line"><a name="l11510"></a><span class="lineno">11510</span>  }</div> +<div class="line"><a name="l11511"></a><span class="lineno">11511</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11512"></a><span class="lineno">11512</span>  <span class="comment">// Already on previous page.</span></div> +<div class="line"><a name="l11513"></a><span class="lineno">11513</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11514"></a><span class="lineno">11514</span>  }</div> +<div class="line"><a name="l11515"></a><span class="lineno">11515</span>  <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div> +<div class="line"><a name="l11516"></a><span class="lineno">11516</span>  {</div> +<div class="line"><a name="l11517"></a><span class="lineno">11517</span>  resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div> +<div class="line"><a name="l11518"></a><span class="lineno">11518</span>  }</div> +<div class="line"><a name="l11519"></a><span class="lineno">11519</span>  }</div> +<div class="line"><a name="l11520"></a><span class="lineno">11520</span>  </div> +<div class="line"><a name="l11521"></a><span class="lineno">11521</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> +<div class="line"><a name="l11522"></a><span class="lineno">11522</span>  pAllocationRequest->sumItemSize = 0;</div> +<div class="line"><a name="l11523"></a><span class="lineno">11523</span>  <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l11524"></a><span class="lineno">11524</span>  </div> +<div class="line"><a name="l11525"></a><span class="lineno">11525</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> +<div class="line"><a name="l11526"></a><span class="lineno">11526</span>  {</div> +<div class="line"><a name="l11527"></a><span class="lineno">11527</span>  <span class="keywordflow">while</span>(index1st < suballocations1st.size() &&</div> +<div class="line"><a name="l11528"></a><span class="lineno">11528</span>  resultOffset + allocSize + VMA_DEBUG_MARGIN > suballocations1st[index1st].offset)</div> +<div class="line"><a name="l11529"></a><span class="lineno">11529</span>  {</div> +<div class="line"><a name="l11530"></a><span class="lineno">11530</span>  <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div> +<div class="line"><a name="l11531"></a><span class="lineno">11531</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[index1st];</div> +<div class="line"><a name="l11532"></a><span class="lineno">11532</span>  <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l11533"></a><span class="lineno">11533</span>  {</div> +<div class="line"><a name="l11534"></a><span class="lineno">11534</span>  <span class="comment">// No problem.</span></div> +<div class="line"><a name="l11535"></a><span class="lineno">11535</span>  }</div> +<div class="line"><a name="l11536"></a><span class="lineno">11536</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11537"></a><span class="lineno">11537</span>  {</div> +<div class="line"><a name="l11538"></a><span class="lineno">11538</span>  VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l11539"></a><span class="lineno">11539</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l11540"></a><span class="lineno">11540</span>  suballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> +<div class="line"><a name="l11541"></a><span class="lineno">11541</span>  {</div> +<div class="line"><a name="l11542"></a><span class="lineno">11542</span>  ++pAllocationRequest->itemsToMakeLostCount;</div> +<div class="line"><a name="l11543"></a><span class="lineno">11543</span>  pAllocationRequest->sumItemSize += suballoc.size;</div> +<div class="line"><a name="l11544"></a><span class="lineno">11544</span>  }</div> +<div class="line"><a name="l11545"></a><span class="lineno">11545</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11546"></a><span class="lineno">11546</span>  {</div> +<div class="line"><a name="l11547"></a><span class="lineno">11547</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11548"></a><span class="lineno">11548</span>  }</div> +<div class="line"><a name="l11549"></a><span class="lineno">11549</span>  }</div> +<div class="line"><a name="l11550"></a><span class="lineno">11550</span>  ++index1st;</div> +<div class="line"><a name="l11551"></a><span class="lineno">11551</span>  }</div> +<div class="line"><a name="l11552"></a><span class="lineno">11552</span>  </div> +<div class="line"><a name="l11553"></a><span class="lineno">11553</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11554"></a><span class="lineno">11554</span>  <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div> +<div class="line"><a name="l11555"></a><span class="lineno">11555</span>  <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)</div> +<div class="line"><a name="l11556"></a><span class="lineno">11556</span>  {</div> +<div class="line"><a name="l11557"></a><span class="lineno">11557</span>  <span class="keywordflow">while</span>(index1st < suballocations1st.size())</div> +<div class="line"><a name="l11558"></a><span class="lineno">11558</span>  {</div> +<div class="line"><a name="l11559"></a><span class="lineno">11559</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[index1st];</div> +<div class="line"><a name="l11560"></a><span class="lineno">11560</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l11561"></a><span class="lineno">11561</span>  {</div> +<div class="line"><a name="l11562"></a><span class="lineno">11562</span>  <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div> +<div class="line"><a name="l11563"></a><span class="lineno">11563</span>  {</div> +<div class="line"><a name="l11564"></a><span class="lineno">11564</span>  <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div> +<div class="line"><a name="l11565"></a><span class="lineno">11565</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l11566"></a><span class="lineno">11566</span>  suballoc.hAllocation->GetLastUseFrameIndex() + frameInUseCount < currentFrameIndex)</div> +<div class="line"><a name="l11567"></a><span class="lineno">11567</span>  {</div> +<div class="line"><a name="l11568"></a><span class="lineno">11568</span>  ++pAllocationRequest->itemsToMakeLostCount;</div> +<div class="line"><a name="l11569"></a><span class="lineno">11569</span>  pAllocationRequest->sumItemSize += suballoc.size;</div> +<div class="line"><a name="l11570"></a><span class="lineno">11570</span>  }</div> +<div class="line"><a name="l11571"></a><span class="lineno">11571</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11572"></a><span class="lineno">11572</span>  {</div> +<div class="line"><a name="l11573"></a><span class="lineno">11573</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11574"></a><span class="lineno">11574</span>  }</div> +<div class="line"><a name="l11575"></a><span class="lineno">11575</span>  }</div> +<div class="line"><a name="l11576"></a><span class="lineno">11576</span>  }</div> +<div class="line"><a name="l11577"></a><span class="lineno">11577</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11578"></a><span class="lineno">11578</span>  {</div> +<div class="line"><a name="l11579"></a><span class="lineno">11579</span>  <span class="comment">// Already on next page.</span></div> +<div class="line"><a name="l11580"></a><span class="lineno">11580</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11581"></a><span class="lineno">11581</span>  }</div> +<div class="line"><a name="l11582"></a><span class="lineno">11582</span>  ++index1st;</div> +<div class="line"><a name="l11583"></a><span class="lineno">11583</span>  }</div> +<div class="line"><a name="l11584"></a><span class="lineno">11584</span>  }</div> +<div class="line"><a name="l11585"></a><span class="lineno">11585</span>  </div> +<div class="line"><a name="l11586"></a><span class="lineno">11586</span>  <span class="comment">// Special case: There is not enough room at the end for this allocation, even after making all from the 1st lost.</span></div> +<div class="line"><a name="l11587"></a><span class="lineno">11587</span>  <span class="keywordflow">if</span>(index1st == suballocations1st.size() &&</div> +<div class="line"><a name="l11588"></a><span class="lineno">11588</span>  resultOffset + allocSize + VMA_DEBUG_MARGIN > size)</div> +<div class="line"><a name="l11589"></a><span class="lineno">11589</span>  {</div> +<div class="line"><a name="l11590"></a><span class="lineno">11590</span>  <span class="comment">// TODO: This is a known bug that it's not yet implemented and the allocation is failing.</span></div> +<div class="line"><a name="l11591"></a><span class="lineno">11591</span>  VMA_DEBUG_LOG(<span class="stringliteral">"Unsupported special case in custom pool with linear allocation algorithm used as ring buffer with allocations that can be lost."</span>);</div> +<div class="line"><a name="l11592"></a><span class="lineno">11592</span>  }</div> +<div class="line"><a name="l11593"></a><span class="lineno">11593</span>  }</div> <div class="line"><a name="l11594"></a><span class="lineno">11594</span>  </div> -<div class="line"><a name="l11595"></a><span class="lineno">11595</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</div> -<div class="line"><a name="l11596"></a><span class="lineno">11596</span> {</div> -<div class="line"><a name="l11597"></a><span class="lineno">11597</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> -<div class="line"><a name="l11598"></a><span class="lineno">11598</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> -<div class="line"><a name="l11599"></a><span class="lineno">11599</span>  </div> -<div class="line"><a name="l11600"></a><span class="lineno">11600</span>  <span class="keywordflow">if</span>(IsEmpty())</div> -<div class="line"><a name="l11601"></a><span class="lineno">11601</span>  {</div> -<div class="line"><a name="l11602"></a><span class="lineno">11602</span>  suballocations1st.clear();</div> -<div class="line"><a name="l11603"></a><span class="lineno">11603</span>  suballocations2nd.clear();</div> -<div class="line"><a name="l11604"></a><span class="lineno">11604</span>  m_1stNullItemsBeginCount = 0;</div> -<div class="line"><a name="l11605"></a><span class="lineno">11605</span>  m_1stNullItemsMiddleCount = 0;</div> -<div class="line"><a name="l11606"></a><span class="lineno">11606</span>  m_2ndNullItemsCount = 0;</div> -<div class="line"><a name="l11607"></a><span class="lineno">11607</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div> -<div class="line"><a name="l11608"></a><span class="lineno">11608</span>  }</div> -<div class="line"><a name="l11609"></a><span class="lineno">11609</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11610"></a><span class="lineno">11610</span>  {</div> -<div class="line"><a name="l11611"></a><span class="lineno">11611</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> -<div class="line"><a name="l11612"></a><span class="lineno">11612</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11613"></a><span class="lineno">11613</span>  VMA_ASSERT(nullItem1stCount <= suballoc1stCount);</div> -<div class="line"><a name="l11614"></a><span class="lineno">11614</span>  </div> -<div class="line"><a name="l11615"></a><span class="lineno">11615</span>  <span class="comment">// Find more null items at the beginning of 1st vector.</span></div> -<div class="line"><a name="l11616"></a><span class="lineno">11616</span>  <span class="keywordflow">while</span>(m_1stNullItemsBeginCount < suballoc1stCount &&</div> -<div class="line"><a name="l11617"></a><span class="lineno">11617</span>  suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11618"></a><span class="lineno">11618</span>  {</div> -<div class="line"><a name="l11619"></a><span class="lineno">11619</span>  ++m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11620"></a><span class="lineno">11620</span>  --m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11621"></a><span class="lineno">11621</span>  }</div> +<div class="line"><a name="l11595"></a><span class="lineno">11595</span>  <span class="comment">// There is enough free space at the end after alignment.</span></div> +<div class="line"><a name="l11596"></a><span class="lineno">11596</span>  <span class="keywordflow">if</span>((index1st == suballocations1st.size() && resultOffset + allocSize + VMA_DEBUG_MARGIN <= size) ||</div> +<div class="line"><a name="l11597"></a><span class="lineno">11597</span>  (index1st < suballocations1st.size() && resultOffset + allocSize + VMA_DEBUG_MARGIN <= suballocations1st[index1st].offset))</div> +<div class="line"><a name="l11598"></a><span class="lineno">11598</span>  {</div> +<div class="line"><a name="l11599"></a><span class="lineno">11599</span>  <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div> +<div class="line"><a name="l11600"></a><span class="lineno">11600</span>  <span class="comment">// If conflict exists, allocation cannot be made here.</span></div> +<div class="line"><a name="l11601"></a><span class="lineno">11601</span>  <span class="keywordflow">if</span>(allocSize % bufferImageGranularity || resultOffset % bufferImageGranularity)</div> +<div class="line"><a name="l11602"></a><span class="lineno">11602</span>  {</div> +<div class="line"><a name="l11603"></a><span class="lineno">11603</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div> +<div class="line"><a name="l11604"></a><span class="lineno">11604</span>  nextSuballocIndex < suballocations1st.size();</div> +<div class="line"><a name="l11605"></a><span class="lineno">11605</span>  nextSuballocIndex++)</div> +<div class="line"><a name="l11606"></a><span class="lineno">11606</span>  {</div> +<div class="line"><a name="l11607"></a><span class="lineno">11607</span>  <span class="keyword">const</span> VmaSuballocation& nextSuballoc = suballocations1st[nextSuballocIndex];</div> +<div class="line"><a name="l11608"></a><span class="lineno">11608</span>  <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div> +<div class="line"><a name="l11609"></a><span class="lineno">11609</span>  {</div> +<div class="line"><a name="l11610"></a><span class="lineno">11610</span>  <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div> +<div class="line"><a name="l11611"></a><span class="lineno">11611</span>  {</div> +<div class="line"><a name="l11612"></a><span class="lineno">11612</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11613"></a><span class="lineno">11613</span>  }</div> +<div class="line"><a name="l11614"></a><span class="lineno">11614</span>  }</div> +<div class="line"><a name="l11615"></a><span class="lineno">11615</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11616"></a><span class="lineno">11616</span>  {</div> +<div class="line"><a name="l11617"></a><span class="lineno">11617</span>  <span class="comment">// Already on next page.</span></div> +<div class="line"><a name="l11618"></a><span class="lineno">11618</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11619"></a><span class="lineno">11619</span>  }</div> +<div class="line"><a name="l11620"></a><span class="lineno">11620</span>  }</div> +<div class="line"><a name="l11621"></a><span class="lineno">11621</span>  }</div> <div class="line"><a name="l11622"></a><span class="lineno">11622</span>  </div> -<div class="line"><a name="l11623"></a><span class="lineno">11623</span>  <span class="comment">// Find more null items at the end of 1st vector.</span></div> -<div class="line"><a name="l11624"></a><span class="lineno">11624</span>  <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount > 0 &&</div> -<div class="line"><a name="l11625"></a><span class="lineno">11625</span>  suballocations1st.back().hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11626"></a><span class="lineno">11626</span>  {</div> -<div class="line"><a name="l11627"></a><span class="lineno">11627</span>  --m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11628"></a><span class="lineno">11628</span>  suballocations1st.pop_back();</div> -<div class="line"><a name="l11629"></a><span class="lineno">11629</span>  }</div> -<div class="line"><a name="l11630"></a><span class="lineno">11630</span>  </div> -<div class="line"><a name="l11631"></a><span class="lineno">11631</span>  <span class="comment">// Find more null items at the end of 2nd vector.</span></div> -<div class="line"><a name="l11632"></a><span class="lineno">11632</span>  <span class="keywordflow">while</span>(m_2ndNullItemsCount > 0 &&</div> -<div class="line"><a name="l11633"></a><span class="lineno">11633</span>  suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11634"></a><span class="lineno">11634</span>  {</div> -<div class="line"><a name="l11635"></a><span class="lineno">11635</span>  --m_2ndNullItemsCount;</div> -<div class="line"><a name="l11636"></a><span class="lineno">11636</span>  suballocations2nd.pop_back();</div> -<div class="line"><a name="l11637"></a><span class="lineno">11637</span>  }</div> -<div class="line"><a name="l11638"></a><span class="lineno">11638</span>  </div> -<div class="line"><a name="l11639"></a><span class="lineno">11639</span>  <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div> -<div class="line"><a name="l11640"></a><span class="lineno">11640</span>  <span class="keywordflow">while</span>(m_2ndNullItemsCount > 0 &&</div> -<div class="line"><a name="l11641"></a><span class="lineno">11641</span>  suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11642"></a><span class="lineno">11642</span>  {</div> -<div class="line"><a name="l11643"></a><span class="lineno">11643</span>  --m_2ndNullItemsCount;</div> -<div class="line"><a name="l11644"></a><span class="lineno">11644</span>  VmaVectorRemove(suballocations2nd, 0);</div> -<div class="line"><a name="l11645"></a><span class="lineno">11645</span>  }</div> -<div class="line"><a name="l11646"></a><span class="lineno">11646</span>  </div> -<div class="line"><a name="l11647"></a><span class="lineno">11647</span>  <span class="keywordflow">if</span>(ShouldCompact1st())</div> -<div class="line"><a name="l11648"></a><span class="lineno">11648</span>  {</div> -<div class="line"><a name="l11649"></a><span class="lineno">11649</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div> -<div class="line"><a name="l11650"></a><span class="lineno">11650</span>  <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11651"></a><span class="lineno">11651</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex < nonNullItemCount; ++dstIndex)</div> -<div class="line"><a name="l11652"></a><span class="lineno">11652</span>  {</div> -<div class="line"><a name="l11653"></a><span class="lineno">11653</span>  <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11654"></a><span class="lineno">11654</span>  {</div> -<div class="line"><a name="l11655"></a><span class="lineno">11655</span>  ++srcIndex;</div> -<div class="line"><a name="l11656"></a><span class="lineno">11656</span>  }</div> -<div class="line"><a name="l11657"></a><span class="lineno">11657</span>  <span class="keywordflow">if</span>(dstIndex != srcIndex)</div> -<div class="line"><a name="l11658"></a><span class="lineno">11658</span>  {</div> -<div class="line"><a name="l11659"></a><span class="lineno">11659</span>  suballocations1st[dstIndex] = suballocations1st[srcIndex];</div> -<div class="line"><a name="l11660"></a><span class="lineno">11660</span>  }</div> -<div class="line"><a name="l11661"></a><span class="lineno">11661</span>  ++srcIndex;</div> -<div class="line"><a name="l11662"></a><span class="lineno">11662</span>  }</div> -<div class="line"><a name="l11663"></a><span class="lineno">11663</span>  suballocations1st.resize(nonNullItemCount);</div> -<div class="line"><a name="l11664"></a><span class="lineno">11664</span>  m_1stNullItemsBeginCount = 0;</div> -<div class="line"><a name="l11665"></a><span class="lineno">11665</span>  m_1stNullItemsMiddleCount = 0;</div> -<div class="line"><a name="l11666"></a><span class="lineno">11666</span>  }</div> -<div class="line"><a name="l11667"></a><span class="lineno">11667</span>  </div> -<div class="line"><a name="l11668"></a><span class="lineno">11668</span>  <span class="comment">// 2nd vector became empty.</span></div> -<div class="line"><a name="l11669"></a><span class="lineno">11669</span>  <span class="keywordflow">if</span>(suballocations2nd.empty())</div> +<div class="line"><a name="l11623"></a><span class="lineno">11623</span>  <span class="comment">// All tests passed: Success.</span></div> +<div class="line"><a name="l11624"></a><span class="lineno">11624</span>  pAllocationRequest->offset = resultOffset;</div> +<div class="line"><a name="l11625"></a><span class="lineno">11625</span>  pAllocationRequest->sumFreeSize =</div> +<div class="line"><a name="l11626"></a><span class="lineno">11626</span>  (index1st < suballocations1st.size() ? suballocations1st[index1st].offset : size)</div> +<div class="line"><a name="l11627"></a><span class="lineno">11627</span>  - resultBaseOffset</div> +<div class="line"><a name="l11628"></a><span class="lineno">11628</span>  - pAllocationRequest->sumItemSize;</div> +<div class="line"><a name="l11629"></a><span class="lineno">11629</span>  pAllocationRequest->type = VmaAllocationRequestType::EndOf2nd;</div> +<div class="line"><a name="l11630"></a><span class="lineno">11630</span>  <span class="comment">// pAllocationRequest->item, customData unused.</span></div> +<div class="line"><a name="l11631"></a><span class="lineno">11631</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l11632"></a><span class="lineno">11632</span>  }</div> +<div class="line"><a name="l11633"></a><span class="lineno">11633</span>  }</div> +<div class="line"><a name="l11634"></a><span class="lineno">11634</span>  </div> +<div class="line"><a name="l11635"></a><span class="lineno">11635</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11636"></a><span class="lineno">11636</span> }</div> +<div class="line"><a name="l11637"></a><span class="lineno">11637</span>  </div> +<div class="line"><a name="l11638"></a><span class="lineno">11638</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l11639"></a><span class="lineno">11639</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l11640"></a><span class="lineno">11640</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l11641"></a><span class="lineno">11641</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l11642"></a><span class="lineno">11642</span> {</div> +<div class="line"><a name="l11643"></a><span class="lineno">11643</span>  <span class="keywordflow">if</span>(pAllocationRequest->itemsToMakeLostCount == 0)</div> +<div class="line"><a name="l11644"></a><span class="lineno">11644</span>  {</div> +<div class="line"><a name="l11645"></a><span class="lineno">11645</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l11646"></a><span class="lineno">11646</span>  }</div> +<div class="line"><a name="l11647"></a><span class="lineno">11647</span>  </div> +<div class="line"><a name="l11648"></a><span class="lineno">11648</span>  VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div> +<div class="line"><a name="l11649"></a><span class="lineno">11649</span>  </div> +<div class="line"><a name="l11650"></a><span class="lineno">11650</span>  <span class="comment">// We always start from 1st.</span></div> +<div class="line"><a name="l11651"></a><span class="lineno">11651</span>  SuballocationVectorType* suballocations = &AccessSuballocations1st();</div> +<div class="line"><a name="l11652"></a><span class="lineno">11652</span>  <span class="keywordtype">size_t</span> index = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l11653"></a><span class="lineno">11653</span>  <span class="keywordtype">size_t</span> madeLostCount = 0;</div> +<div class="line"><a name="l11654"></a><span class="lineno">11654</span>  <span class="keywordflow">while</span>(madeLostCount < pAllocationRequest->itemsToMakeLostCount)</div> +<div class="line"><a name="l11655"></a><span class="lineno">11655</span>  {</div> +<div class="line"><a name="l11656"></a><span class="lineno">11656</span>  <span class="keywordflow">if</span>(index == suballocations->size())</div> +<div class="line"><a name="l11657"></a><span class="lineno">11657</span>  {</div> +<div class="line"><a name="l11658"></a><span class="lineno">11658</span>  index = 0;</div> +<div class="line"><a name="l11659"></a><span class="lineno">11659</span>  <span class="comment">// If we get to the end of 1st, we wrap around to beginning of 2nd of 1st.</span></div> +<div class="line"><a name="l11660"></a><span class="lineno">11660</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> +<div class="line"><a name="l11661"></a><span class="lineno">11661</span>  {</div> +<div class="line"><a name="l11662"></a><span class="lineno">11662</span>  suballocations = &AccessSuballocations2nd();</div> +<div class="line"><a name="l11663"></a><span class="lineno">11663</span>  }</div> +<div class="line"><a name="l11664"></a><span class="lineno">11664</span>  <span class="comment">// else: m_2ndVectorMode == SECOND_VECTOR_EMPTY:</span></div> +<div class="line"><a name="l11665"></a><span class="lineno">11665</span>  <span class="comment">// suballocations continues pointing at AccessSuballocations1st().</span></div> +<div class="line"><a name="l11666"></a><span class="lineno">11666</span>  VMA_ASSERT(!suballocations->empty());</div> +<div class="line"><a name="l11667"></a><span class="lineno">11667</span>  }</div> +<div class="line"><a name="l11668"></a><span class="lineno">11668</span>  VmaSuballocation& suballoc = (*suballocations)[index];</div> +<div class="line"><a name="l11669"></a><span class="lineno">11669</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> <div class="line"><a name="l11670"></a><span class="lineno">11670</span>  {</div> -<div class="line"><a name="l11671"></a><span class="lineno">11671</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div> -<div class="line"><a name="l11672"></a><span class="lineno">11672</span>  }</div> -<div class="line"><a name="l11673"></a><span class="lineno">11673</span>  </div> -<div class="line"><a name="l11674"></a><span class="lineno">11674</span>  <span class="comment">// 1st vector became empty.</span></div> -<div class="line"><a name="l11675"></a><span class="lineno">11675</span>  <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</div> -<div class="line"><a name="l11676"></a><span class="lineno">11676</span>  {</div> -<div class="line"><a name="l11677"></a><span class="lineno">11677</span>  suballocations1st.clear();</div> -<div class="line"><a name="l11678"></a><span class="lineno">11678</span>  m_1stNullItemsBeginCount = 0;</div> -<div class="line"><a name="l11679"></a><span class="lineno">11679</span>  </div> -<div class="line"><a name="l11680"></a><span class="lineno">11680</span>  <span class="keywordflow">if</span>(!suballocations2nd.empty() && m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div> -<div class="line"><a name="l11681"></a><span class="lineno">11681</span>  {</div> -<div class="line"><a name="l11682"></a><span class="lineno">11682</span>  <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div> -<div class="line"><a name="l11683"></a><span class="lineno">11683</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div> -<div class="line"><a name="l11684"></a><span class="lineno">11684</span>  m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div> -<div class="line"><a name="l11685"></a><span class="lineno">11685</span>  <span class="keywordflow">while</span>(m_1stNullItemsBeginCount < suballocations2nd.size() &&</div> -<div class="line"><a name="l11686"></a><span class="lineno">11686</span>  suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div> -<div class="line"><a name="l11687"></a><span class="lineno">11687</span>  {</div> -<div class="line"><a name="l11688"></a><span class="lineno">11688</span>  ++m_1stNullItemsBeginCount;</div> -<div class="line"><a name="l11689"></a><span class="lineno">11689</span>  --m_1stNullItemsMiddleCount;</div> -<div class="line"><a name="l11690"></a><span class="lineno">11690</span>  }</div> -<div class="line"><a name="l11691"></a><span class="lineno">11691</span>  m_2ndNullItemsCount = 0;</div> -<div class="line"><a name="l11692"></a><span class="lineno">11692</span>  m_1stVectorIndex ^= 1;</div> -<div class="line"><a name="l11693"></a><span class="lineno">11693</span>  }</div> -<div class="line"><a name="l11694"></a><span class="lineno">11694</span>  }</div> -<div class="line"><a name="l11695"></a><span class="lineno">11695</span>  }</div> -<div class="line"><a name="l11696"></a><span class="lineno">11696</span>  </div> -<div class="line"><a name="l11697"></a><span class="lineno">11697</span>  VMA_HEAVY_ASSERT(Validate());</div> -<div class="line"><a name="l11698"></a><span class="lineno">11698</span> }</div> -<div class="line"><a name="l11699"></a><span class="lineno">11699</span>  </div> -<div class="line"><a name="l11700"></a><span class="lineno">11700</span>  </div> -<div class="line"><a name="l11702"></a><span class="lineno">11702</span> <span class="comment">// class VmaBlockMetadata_Buddy</span></div> -<div class="line"><a name="l11703"></a><span class="lineno">11703</span>  </div> -<div class="line"><a name="l11704"></a><span class="lineno">11704</span> VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> -<div class="line"><a name="l11705"></a><span class="lineno">11705</span>  VmaBlockMetadata(hAllocator),</div> -<div class="line"><a name="l11706"></a><span class="lineno">11706</span>  m_Root(VMA_NULL),</div> -<div class="line"><a name="l11707"></a><span class="lineno">11707</span>  m_AllocationCount(0),</div> -<div class="line"><a name="l11708"></a><span class="lineno">11708</span>  m_FreeCount(1),</div> -<div class="line"><a name="l11709"></a><span class="lineno">11709</span>  m_SumFreeSize(0)</div> -<div class="line"><a name="l11710"></a><span class="lineno">11710</span> {</div> -<div class="line"><a name="l11711"></a><span class="lineno">11711</span>  memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div> -<div class="line"><a name="l11712"></a><span class="lineno">11712</span> }</div> -<div class="line"><a name="l11713"></a><span class="lineno">11713</span>  </div> -<div class="line"><a name="l11714"></a><span class="lineno">11714</span> VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</div> -<div class="line"><a name="l11715"></a><span class="lineno">11715</span> {</div> -<div class="line"><a name="l11716"></a><span class="lineno">11716</span>  DeleteNode(m_Root);</div> -<div class="line"><a name="l11717"></a><span class="lineno">11717</span> }</div> -<div class="line"><a name="l11718"></a><span class="lineno">11718</span>  </div> -<div class="line"><a name="l11719"></a><span class="lineno">11719</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div> -<div class="line"><a name="l11720"></a><span class="lineno">11720</span> {</div> -<div class="line"><a name="l11721"></a><span class="lineno">11721</span>  VmaBlockMetadata::Init(size);</div> -<div class="line"><a name="l11722"></a><span class="lineno">11722</span>  </div> -<div class="line"><a name="l11723"></a><span class="lineno">11723</span>  m_UsableSize = VmaPrevPow2(size);</div> -<div class="line"><a name="l11724"></a><span class="lineno">11724</span>  m_SumFreeSize = m_UsableSize;</div> -<div class="line"><a name="l11725"></a><span class="lineno">11725</span>  </div> -<div class="line"><a name="l11726"></a><span class="lineno">11726</span>  <span class="comment">// Calculate m_LevelCount.</span></div> -<div class="line"><a name="l11727"></a><span class="lineno">11727</span>  m_LevelCount = 1;</div> -<div class="line"><a name="l11728"></a><span class="lineno">11728</span>  <span class="keywordflow">while</span>(m_LevelCount < MAX_LEVELS &&</div> -<div class="line"><a name="l11729"></a><span class="lineno">11729</span>  LevelToNodeSize(m_LevelCount) >= MIN_NODE_SIZE)</div> -<div class="line"><a name="l11730"></a><span class="lineno">11730</span>  {</div> -<div class="line"><a name="l11731"></a><span class="lineno">11731</span>  ++m_LevelCount;</div> -<div class="line"><a name="l11732"></a><span class="lineno">11732</span>  }</div> -<div class="line"><a name="l11733"></a><span class="lineno">11733</span>  </div> -<div class="line"><a name="l11734"></a><span class="lineno">11734</span>  Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div> -<div class="line"><a name="l11735"></a><span class="lineno">11735</span>  rootNode->offset = 0;</div> -<div class="line"><a name="l11736"></a><span class="lineno">11736</span>  rootNode->type = Node::TYPE_FREE;</div> -<div class="line"><a name="l11737"></a><span class="lineno">11737</span>  rootNode->parent = VMA_NULL;</div> -<div class="line"><a name="l11738"></a><span class="lineno">11738</span>  rootNode->buddy = VMA_NULL;</div> -<div class="line"><a name="l11739"></a><span class="lineno">11739</span>  </div> -<div class="line"><a name="l11740"></a><span class="lineno">11740</span>  m_Root = rootNode;</div> -<div class="line"><a name="l11741"></a><span class="lineno">11741</span>  AddToFreeListFront(0, rootNode);</div> -<div class="line"><a name="l11742"></a><span class="lineno">11742</span> }</div> -<div class="line"><a name="l11743"></a><span class="lineno">11743</span>  </div> -<div class="line"><a name="l11744"></a><span class="lineno">11744</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div> -<div class="line"><a name="l11745"></a><span class="lineno">11745</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11746"></a><span class="lineno">11746</span>  <span class="comment">// Validate tree.</span></div> -<div class="line"><a name="l11747"></a><span class="lineno">11747</span>  ValidationContext ctx;</div> -<div class="line"><a name="l11748"></a><span class="lineno">11748</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</div> -<div class="line"><a name="l11749"></a><span class="lineno">11749</span>  {</div> -<div class="line"><a name="l11750"></a><span class="lineno">11750</span>  VMA_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode failed."</span>);</div> -<div class="line"><a name="l11751"></a><span class="lineno">11751</span>  }</div> -<div class="line"><a name="l11752"></a><span class="lineno">11752</span>  VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div> -<div class="line"><a name="l11753"></a><span class="lineno">11753</span>  VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</div> -<div class="line"><a name="l11754"></a><span class="lineno">11754</span>  </div> -<div class="line"><a name="l11755"></a><span class="lineno">11755</span>  <span class="comment">// Validate free node lists.</span></div> -<div class="line"><a name="l11756"></a><span class="lineno">11756</span>  <span class="keywordflow">for</span>(uint32_t level = 0; level < m_LevelCount; ++level)</div> -<div class="line"><a name="l11757"></a><span class="lineno">11757</span>  {</div> -<div class="line"><a name="l11758"></a><span class="lineno">11758</span>  VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div> -<div class="line"><a name="l11759"></a><span class="lineno">11759</span>  m_FreeList[level].front->free.prev == VMA_NULL);</div> -<div class="line"><a name="l11760"></a><span class="lineno">11760</span>  </div> -<div class="line"><a name="l11761"></a><span class="lineno">11761</span>  <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div> -<div class="line"><a name="l11762"></a><span class="lineno">11762</span>  node != VMA_NULL;</div> -<div class="line"><a name="l11763"></a><span class="lineno">11763</span>  node = node->free.next)</div> -<div class="line"><a name="l11764"></a><span class="lineno">11764</span>  {</div> -<div class="line"><a name="l11765"></a><span class="lineno">11765</span>  VMA_VALIDATE(node->type == Node::TYPE_FREE);</div> -<div class="line"><a name="l11766"></a><span class="lineno">11766</span>  </div> -<div class="line"><a name="l11767"></a><span class="lineno">11767</span>  <span class="keywordflow">if</span>(node->free.next == VMA_NULL)</div> -<div class="line"><a name="l11768"></a><span class="lineno">11768</span>  {</div> -<div class="line"><a name="l11769"></a><span class="lineno">11769</span>  VMA_VALIDATE(m_FreeList[level].back == node);</div> -<div class="line"><a name="l11770"></a><span class="lineno">11770</span>  }</div> -<div class="line"><a name="l11771"></a><span class="lineno">11771</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l11772"></a><span class="lineno">11772</span>  {</div> -<div class="line"><a name="l11773"></a><span class="lineno">11773</span>  VMA_VALIDATE(node->free.next->free.prev == node);</div> -<div class="line"><a name="l11774"></a><span class="lineno">11774</span>  }</div> -<div class="line"><a name="l11775"></a><span class="lineno">11775</span>  }</div> -<div class="line"><a name="l11776"></a><span class="lineno">11776</span>  }</div> -<div class="line"><a name="l11777"></a><span class="lineno">11777</span>  </div> -<div class="line"><a name="l11778"></a><span class="lineno">11778</span>  <span class="comment">// Validate that free lists ar higher levels are empty.</span></div> -<div class="line"><a name="l11779"></a><span class="lineno">11779</span>  <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level < MAX_LEVELS; ++level)</div> -<div class="line"><a name="l11780"></a><span class="lineno">11780</span>  {</div> -<div class="line"><a name="l11781"></a><span class="lineno">11781</span>  VMA_VALIDATE(m_FreeList[level].front == VMA_NULL && m_FreeList[level].back == VMA_NULL);</div> -<div class="line"><a name="l11782"></a><span class="lineno">11782</span>  }</div> -<div class="line"><a name="l11783"></a><span class="lineno">11783</span>  </div> -<div class="line"><a name="l11784"></a><span class="lineno">11784</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11785"></a><span class="lineno">11785</span> }</div> -<div class="line"><a name="l11786"></a><span class="lineno">11786</span>  </div> -<div class="line"><a name="l11787"></a><span class="lineno">11787</span> VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> -<div class="line"><a name="l11788"></a><span class="lineno">11788</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11789"></a><span class="lineno">11789</span>  <span class="keywordflow">for</span>(uint32_t level = 0; level < m_LevelCount; ++level)</div> -<div class="line"><a name="l11790"></a><span class="lineno">11790</span>  {</div> -<div class="line"><a name="l11791"></a><span class="lineno">11791</span>  <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div> -<div class="line"><a name="l11792"></a><span class="lineno">11792</span>  {</div> -<div class="line"><a name="l11793"></a><span class="lineno">11793</span>  <span class="keywordflow">return</span> LevelToNodeSize(level);</div> -<div class="line"><a name="l11794"></a><span class="lineno">11794</span>  }</div> -<div class="line"><a name="l11795"></a><span class="lineno">11795</span>  }</div> -<div class="line"><a name="l11796"></a><span class="lineno">11796</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l11797"></a><span class="lineno">11797</span> }</div> -<div class="line"><a name="l11798"></a><span class="lineno">11798</span>  </div> -<div class="line"><a name="l11799"></a><span class="lineno">11799</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> -<div class="line"><a name="l11800"></a><span class="lineno">11800</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11801"></a><span class="lineno">11801</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div> -<div class="line"><a name="l11802"></a><span class="lineno">11802</span>  </div> -<div class="line"><a name="l11803"></a><span class="lineno">11803</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div> -<div class="line"><a name="l11804"></a><span class="lineno">11804</span>  </div> -<div class="line"><a name="l11805"></a><span class="lineno">11805</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> -<div class="line"><a name="l11806"></a><span class="lineno">11806</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div> -<div class="line"><a name="l11807"></a><span class="lineno">11807</span>  </div> -<div class="line"><a name="l11808"></a><span class="lineno">11808</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> -<div class="line"><a name="l11809"></a><span class="lineno">11809</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l11810"></a><span class="lineno">11810</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div> +<div class="line"><a name="l11671"></a><span class="lineno">11671</span>  VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div> +<div class="line"><a name="l11672"></a><span class="lineno">11672</span>  VMA_ASSERT(suballoc.hAllocation->CanBecomeLost());</div> +<div class="line"><a name="l11673"></a><span class="lineno">11673</span>  <span class="keywordflow">if</span>(suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> +<div class="line"><a name="l11674"></a><span class="lineno">11674</span>  {</div> +<div class="line"><a name="l11675"></a><span class="lineno">11675</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11676"></a><span class="lineno">11676</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11677"></a><span class="lineno">11677</span>  m_SumFreeSize += suballoc.size;</div> +<div class="line"><a name="l11678"></a><span class="lineno">11678</span>  <span class="keywordflow">if</span>(suballocations == &AccessSuballocations1st())</div> +<div class="line"><a name="l11679"></a><span class="lineno">11679</span>  {</div> +<div class="line"><a name="l11680"></a><span class="lineno">11680</span>  ++m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11681"></a><span class="lineno">11681</span>  }</div> +<div class="line"><a name="l11682"></a><span class="lineno">11682</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11683"></a><span class="lineno">11683</span>  {</div> +<div class="line"><a name="l11684"></a><span class="lineno">11684</span>  ++m_2ndNullItemsCount;</div> +<div class="line"><a name="l11685"></a><span class="lineno">11685</span>  }</div> +<div class="line"><a name="l11686"></a><span class="lineno">11686</span>  ++madeLostCount;</div> +<div class="line"><a name="l11687"></a><span class="lineno">11687</span>  }</div> +<div class="line"><a name="l11688"></a><span class="lineno">11688</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l11689"></a><span class="lineno">11689</span>  {</div> +<div class="line"><a name="l11690"></a><span class="lineno">11690</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l11691"></a><span class="lineno">11691</span>  }</div> +<div class="line"><a name="l11692"></a><span class="lineno">11692</span>  }</div> +<div class="line"><a name="l11693"></a><span class="lineno">11693</span>  ++index;</div> +<div class="line"><a name="l11694"></a><span class="lineno">11694</span>  }</div> +<div class="line"><a name="l11695"></a><span class="lineno">11695</span>  </div> +<div class="line"><a name="l11696"></a><span class="lineno">11696</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11697"></a><span class="lineno">11697</span>  <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by CleanupAfterFree().</span></div> +<div class="line"><a name="l11698"></a><span class="lineno">11698</span>  </div> +<div class="line"><a name="l11699"></a><span class="lineno">11699</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l11700"></a><span class="lineno">11700</span> }</div> +<div class="line"><a name="l11701"></a><span class="lineno">11701</span>  </div> +<div class="line"><a name="l11702"></a><span class="lineno">11702</span> uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> +<div class="line"><a name="l11703"></a><span class="lineno">11703</span> {</div> +<div class="line"><a name="l11704"></a><span class="lineno">11704</span>  uint32_t lostAllocationCount = 0;</div> +<div class="line"><a name="l11705"></a><span class="lineno">11705</span>  </div> +<div class="line"><a name="l11706"></a><span class="lineno">11706</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11707"></a><span class="lineno">11707</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)</div> +<div class="line"><a name="l11708"></a><span class="lineno">11708</span>  {</div> +<div class="line"><a name="l11709"></a><span class="lineno">11709</span>  VmaSuballocation& suballoc = suballocations1st[i];</div> +<div class="line"><a name="l11710"></a><span class="lineno">11710</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &&</div> +<div class="line"><a name="l11711"></a><span class="lineno">11711</span>  suballoc.hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l11712"></a><span class="lineno">11712</span>  suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> +<div class="line"><a name="l11713"></a><span class="lineno">11713</span>  {</div> +<div class="line"><a name="l11714"></a><span class="lineno">11714</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11715"></a><span class="lineno">11715</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11716"></a><span class="lineno">11716</span>  ++m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11717"></a><span class="lineno">11717</span>  m_SumFreeSize += suballoc.size;</div> +<div class="line"><a name="l11718"></a><span class="lineno">11718</span>  ++lostAllocationCount;</div> +<div class="line"><a name="l11719"></a><span class="lineno">11719</span>  }</div> +<div class="line"><a name="l11720"></a><span class="lineno">11720</span>  }</div> +<div class="line"><a name="l11721"></a><span class="lineno">11721</span>  </div> +<div class="line"><a name="l11722"></a><span class="lineno">11722</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11723"></a><span class="lineno">11723</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i < count; ++i)</div> +<div class="line"><a name="l11724"></a><span class="lineno">11724</span>  {</div> +<div class="line"><a name="l11725"></a><span class="lineno">11725</span>  VmaSuballocation& suballoc = suballocations2nd[i];</div> +<div class="line"><a name="l11726"></a><span class="lineno">11726</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &&</div> +<div class="line"><a name="l11727"></a><span class="lineno">11727</span>  suballoc.hAllocation->CanBecomeLost() &&</div> +<div class="line"><a name="l11728"></a><span class="lineno">11728</span>  suballoc.hAllocation->MakeLost(currentFrameIndex, frameInUseCount))</div> +<div class="line"><a name="l11729"></a><span class="lineno">11729</span>  {</div> +<div class="line"><a name="l11730"></a><span class="lineno">11730</span>  suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11731"></a><span class="lineno">11731</span>  suballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11732"></a><span class="lineno">11732</span>  ++m_2ndNullItemsCount;</div> +<div class="line"><a name="l11733"></a><span class="lineno">11733</span>  m_SumFreeSize += suballoc.size;</div> +<div class="line"><a name="l11734"></a><span class="lineno">11734</span>  ++lostAllocationCount;</div> +<div class="line"><a name="l11735"></a><span class="lineno">11735</span>  }</div> +<div class="line"><a name="l11736"></a><span class="lineno">11736</span>  }</div> +<div class="line"><a name="l11737"></a><span class="lineno">11737</span>  </div> +<div class="line"><a name="l11738"></a><span class="lineno">11738</span>  <span class="keywordflow">if</span>(lostAllocationCount)</div> +<div class="line"><a name="l11739"></a><span class="lineno">11739</span>  {</div> +<div class="line"><a name="l11740"></a><span class="lineno">11740</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11741"></a><span class="lineno">11741</span>  }</div> +<div class="line"><a name="l11742"></a><span class="lineno">11742</span>  </div> +<div class="line"><a name="l11743"></a><span class="lineno">11743</span>  <span class="keywordflow">return</span> lostAllocationCount;</div> +<div class="line"><a name="l11744"></a><span class="lineno">11744</span> }</div> +<div class="line"><a name="l11745"></a><span class="lineno">11745</span>  </div> +<div class="line"><a name="l11746"></a><span class="lineno">11746</span> VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div> +<div class="line"><a name="l11747"></a><span class="lineno">11747</span> {</div> +<div class="line"><a name="l11748"></a><span class="lineno">11748</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11749"></a><span class="lineno">11749</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i < count; ++i)</div> +<div class="line"><a name="l11750"></a><span class="lineno">11750</span>  {</div> +<div class="line"><a name="l11751"></a><span class="lineno">11751</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations1st[i];</div> +<div class="line"><a name="l11752"></a><span class="lineno">11752</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l11753"></a><span class="lineno">11753</span>  {</div> +<div class="line"><a name="l11754"></a><span class="lineno">11754</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div> +<div class="line"><a name="l11755"></a><span class="lineno">11755</span>  {</div> +<div class="line"><a name="l11756"></a><span class="lineno">11756</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l11757"></a><span class="lineno">11757</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l11758"></a><span class="lineno">11758</span>  }</div> +<div class="line"><a name="l11759"></a><span class="lineno">11759</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div> +<div class="line"><a name="l11760"></a><span class="lineno">11760</span>  {</div> +<div class="line"><a name="l11761"></a><span class="lineno">11761</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l11762"></a><span class="lineno">11762</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l11763"></a><span class="lineno">11763</span>  }</div> +<div class="line"><a name="l11764"></a><span class="lineno">11764</span>  }</div> +<div class="line"><a name="l11765"></a><span class="lineno">11765</span>  }</div> +<div class="line"><a name="l11766"></a><span class="lineno">11766</span>  </div> +<div class="line"><a name="l11767"></a><span class="lineno">11767</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11768"></a><span class="lineno">11768</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i < count; ++i)</div> +<div class="line"><a name="l11769"></a><span class="lineno">11769</span>  {</div> +<div class="line"><a name="l11770"></a><span class="lineno">11770</span>  <span class="keyword">const</span> VmaSuballocation& suballoc = suballocations2nd[i];</div> +<div class="line"><a name="l11771"></a><span class="lineno">11771</span>  <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div> +<div class="line"><a name="l11772"></a><span class="lineno">11772</span>  {</div> +<div class="line"><a name="l11773"></a><span class="lineno">11773</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div> +<div class="line"><a name="l11774"></a><span class="lineno">11774</span>  {</div> +<div class="line"><a name="l11775"></a><span class="lineno">11775</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l11776"></a><span class="lineno">11776</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l11777"></a><span class="lineno">11777</span>  }</div> +<div class="line"><a name="l11778"></a><span class="lineno">11778</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div> +<div class="line"><a name="l11779"></a><span class="lineno">11779</span>  {</div> +<div class="line"><a name="l11780"></a><span class="lineno">11780</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!"</span>);</div> +<div class="line"><a name="l11781"></a><span class="lineno">11781</span>  <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div> +<div class="line"><a name="l11782"></a><span class="lineno">11782</span>  }</div> +<div class="line"><a name="l11783"></a><span class="lineno">11783</span>  }</div> +<div class="line"><a name="l11784"></a><span class="lineno">11784</span>  }</div> +<div class="line"><a name="l11785"></a><span class="lineno">11785</span>  </div> +<div class="line"><a name="l11786"></a><span class="lineno">11786</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> +<div class="line"><a name="l11787"></a><span class="lineno">11787</span> }</div> +<div class="line"><a name="l11788"></a><span class="lineno">11788</span>  </div> +<div class="line"><a name="l11789"></a><span class="lineno">11789</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div> +<div class="line"><a name="l11790"></a><span class="lineno">11790</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l11791"></a><span class="lineno">11791</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l11792"></a><span class="lineno">11792</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l11793"></a><span class="lineno">11793</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div> +<div class="line"><a name="l11794"></a><span class="lineno">11794</span> {</div> +<div class="line"><a name="l11795"></a><span class="lineno">11795</span>  <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div> +<div class="line"><a name="l11796"></a><span class="lineno">11796</span>  </div> +<div class="line"><a name="l11797"></a><span class="lineno">11797</span>  <span class="keywordflow">switch</span>(request.type)</div> +<div class="line"><a name="l11798"></a><span class="lineno">11798</span>  {</div> +<div class="line"><a name="l11799"></a><span class="lineno">11799</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::UpperAddress:</div> +<div class="line"><a name="l11800"></a><span class="lineno">11800</span>  {</div> +<div class="line"><a name="l11801"></a><span class="lineno">11801</span>  VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &&</div> +<div class="line"><a name="l11802"></a><span class="lineno">11802</span>  <span class="stringliteral">"CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer."</span>);</div> +<div class="line"><a name="l11803"></a><span class="lineno">11803</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11804"></a><span class="lineno">11804</span>  suballocations2nd.push_back(newSuballoc);</div> +<div class="line"><a name="l11805"></a><span class="lineno">11805</span>  m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div> +<div class="line"><a name="l11806"></a><span class="lineno">11806</span>  }</div> +<div class="line"><a name="l11807"></a><span class="lineno">11807</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11808"></a><span class="lineno">11808</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf1st:</div> +<div class="line"><a name="l11809"></a><span class="lineno">11809</span>  {</div> +<div class="line"><a name="l11810"></a><span class="lineno">11810</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> <div class="line"><a name="l11811"></a><span class="lineno">11811</span>  </div> -<div class="line"><a name="l11812"></a><span class="lineno">11812</span>  CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</div> -<div class="line"><a name="l11813"></a><span class="lineno">11813</span>  </div> -<div class="line"><a name="l11814"></a><span class="lineno">11814</span>  <span class="keywordflow">if</span>(unusableSize > 0)</div> -<div class="line"><a name="l11815"></a><span class="lineno">11815</span>  {</div> -<div class="line"><a name="l11816"></a><span class="lineno">11816</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l11817"></a><span class="lineno">11817</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div> -<div class="line"><a name="l11818"></a><span class="lineno">11818</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusableSize);</div> -<div class="line"><a name="l11819"></a><span class="lineno">11819</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusableSize);</div> -<div class="line"><a name="l11820"></a><span class="lineno">11820</span>  }</div> -<div class="line"><a name="l11821"></a><span class="lineno">11821</span> }</div> -<div class="line"><a name="l11822"></a><span class="lineno">11822</span>  </div> -<div class="line"><a name="l11823"></a><span class="lineno">11823</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> -<div class="line"><a name="l11824"></a><span class="lineno">11824</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11825"></a><span class="lineno">11825</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div> -<div class="line"><a name="l11826"></a><span class="lineno">11826</span>  </div> -<div class="line"><a name="l11827"></a><span class="lineno">11827</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div> -<div class="line"><a name="l11828"></a><span class="lineno">11828</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div> -<div class="line"><a name="l11829"></a><span class="lineno">11829</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div> -<div class="line"><a name="l11830"></a><span class="lineno">11830</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div> -<div class="line"><a name="l11831"></a><span class="lineno">11831</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div> -<div class="line"><a name="l11832"></a><span class="lineno">11832</span>  </div> -<div class="line"><a name="l11833"></a><span class="lineno">11833</span>  <span class="keywordflow">if</span>(unusableSize > 0)</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>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> -<div class="line"><a name="l11836"></a><span class="lineno">11836</span>  <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</span></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>  </div> -<div class="line"><a name="l11840"></a><span class="lineno">11840</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l11841"></a><span class="lineno">11841</span>  </div> -<div class="line"><a name="l11842"></a><span class="lineno">11842</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> -<div class="line"><a name="l11843"></a><span class="lineno">11843</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l11844"></a><span class="lineno">11844</span>  <span class="comment">// TODO optimize</span></div> -<div class="line"><a name="l11845"></a><span class="lineno">11845</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div> -<div class="line"><a name="l11846"></a><span class="lineno">11846</span>  CalcAllocationStatInfo(stat);</div> -<div class="line"><a name="l11847"></a><span class="lineno">11847</span>  </div> -<div class="line"><a name="l11848"></a><span class="lineno">11848</span>  PrintDetailedMap_Begin(</div> -<div class="line"><a name="l11849"></a><span class="lineno">11849</span>  json,</div> -<div class="line"><a name="l11850"></a><span class="lineno">11850</span>  stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div> -<div class="line"><a name="l11851"></a><span class="lineno">11851</span>  stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div> -<div class="line"><a name="l11852"></a><span class="lineno">11852</span>  stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div> -<div class="line"><a name="l11853"></a><span class="lineno">11853</span>  </div> -<div class="line"><a name="l11854"></a><span class="lineno">11854</span>  PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div> +<div class="line"><a name="l11812"></a><span class="lineno">11812</span>  VMA_ASSERT(suballocations1st.empty() ||</div> +<div class="line"><a name="l11813"></a><span class="lineno">11813</span>  request.offset >= suballocations1st.back().offset + suballocations1st.back().size);</div> +<div class="line"><a name="l11814"></a><span class="lineno">11814</span>  <span class="comment">// Check if it fits before the end of the block.</span></div> +<div class="line"><a name="l11815"></a><span class="lineno">11815</span>  VMA_ASSERT(request.offset + allocSize <= GetSize());</div> +<div class="line"><a name="l11816"></a><span class="lineno">11816</span>  </div> +<div class="line"><a name="l11817"></a><span class="lineno">11817</span>  suballocations1st.push_back(newSuballoc);</div> +<div class="line"><a name="l11818"></a><span class="lineno">11818</span>  }</div> +<div class="line"><a name="l11819"></a><span class="lineno">11819</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11820"></a><span class="lineno">11820</span>  <span class="keywordflow">case</span> VmaAllocationRequestType::EndOf2nd:</div> +<div class="line"><a name="l11821"></a><span class="lineno">11821</span>  {</div> +<div class="line"><a name="l11822"></a><span class="lineno">11822</span>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11823"></a><span class="lineno">11823</span>  <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div> +<div class="line"><a name="l11824"></a><span class="lineno">11824</span>  VMA_ASSERT(!suballocations1st.empty() &&</div> +<div class="line"><a name="l11825"></a><span class="lineno">11825</span>  request.offset + allocSize <= suballocations1st[m_1stNullItemsBeginCount].offset);</div> +<div class="line"><a name="l11826"></a><span class="lineno">11826</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<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>  <span class="keywordflow">switch</span>(m_2ndVectorMode)</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="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div> +<div class="line"><a name="l11831"></a><span class="lineno">11831</span>  <span class="comment">// First allocation from second part ring buffer.</span></div> +<div class="line"><a name="l11832"></a><span class="lineno">11832</span>  VMA_ASSERT(suballocations2nd.empty());</div> +<div class="line"><a name="l11833"></a><span class="lineno">11833</span>  m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div> +<div class="line"><a name="l11834"></a><span class="lineno">11834</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11835"></a><span class="lineno">11835</span>  <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div> +<div class="line"><a name="l11836"></a><span class="lineno">11836</span>  <span class="comment">// 2-part ring buffer is already started.</span></div> +<div class="line"><a name="l11837"></a><span class="lineno">11837</span>  VMA_ASSERT(!suballocations2nd.empty());</div> +<div class="line"><a name="l11838"></a><span class="lineno">11838</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11839"></a><span class="lineno">11839</span>  <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div> +<div class="line"><a name="l11840"></a><span class="lineno">11840</span>  VMA_ASSERT(0 && <span class="stringliteral">"CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack."</span>);</div> +<div class="line"><a name="l11841"></a><span class="lineno">11841</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11842"></a><span class="lineno">11842</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l11843"></a><span class="lineno">11843</span>  VMA_ASSERT(0);</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>  </div> +<div class="line"><a name="l11846"></a><span class="lineno">11846</span>  suballocations2nd.push_back(newSuballoc);</div> +<div class="line"><a name="l11847"></a><span class="lineno">11847</span>  }</div> +<div class="line"><a name="l11848"></a><span class="lineno">11848</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l11849"></a><span class="lineno">11849</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l11850"></a><span class="lineno">11850</span>  VMA_ASSERT(0 && <span class="stringliteral">"CRITICAL INTERNAL ERROR."</span>);</div> +<div class="line"><a name="l11851"></a><span class="lineno">11851</span>  }</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>  m_SumFreeSize -= newSuballoc.size;</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>  </div> -<div class="line"><a name="l11856"></a><span class="lineno">11856</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div> -<div class="line"><a name="l11857"></a><span class="lineno">11857</span>  <span class="keywordflow">if</span>(unusableSize > 0)</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>  PrintDetailedMap_UnusedRange(json,</div> -<div class="line"><a name="l11860"></a><span class="lineno">11860</span>  m_UsableSize, <span class="comment">// offset</span></div> -<div class="line"><a name="l11861"></a><span class="lineno">11861</span>  unusableSize); <span class="comment">// size</span></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>  </div> -<div class="line"><a name="l11864"></a><span class="lineno">11864</span>  PrintDetailedMap_End(json);</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>  </div> -<div class="line"><a name="l11867"></a><span class="lineno">11867</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div> -<div class="line"><a name="l11870"></a><span class="lineno">11870</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l11871"></a><span class="lineno">11871</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l11872"></a><span class="lineno">11872</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l11873"></a><span class="lineno">11873</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l11874"></a><span class="lineno">11874</span>  VkDeviceSize allocAlignment,</div> -<div class="line"><a name="l11875"></a><span class="lineno">11875</span>  <span class="keywordtype">bool</span> upperAddress,</div> -<div class="line"><a name="l11876"></a><span class="lineno">11876</span>  VmaSuballocationType allocType,</div> -<div class="line"><a name="l11877"></a><span class="lineno">11877</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> -<div class="line"><a name="l11878"></a><span class="lineno">11878</span>  uint32_t strategy,</div> -<div class="line"><a name="l11879"></a><span class="lineno">11879</span>  VmaAllocationRequest* pAllocationRequest)</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>  VMA_ASSERT(!upperAddress && <span class="stringliteral">"VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm."</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="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div> -<div class="line"><a name="l11884"></a><span class="lineno">11884</span>  <span class="comment">// Whenever it might be an OPTIMAL image...</span></div> -<div class="line"><a name="l11885"></a><span class="lineno">11885</span>  <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div> -<div class="line"><a name="l11886"></a><span class="lineno">11886</span>  allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> -<div class="line"><a name="l11887"></a><span class="lineno">11887</span>  allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</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>  allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div> -<div class="line"><a name="l11890"></a><span class="lineno">11890</span>  allocSize = VMA_MAX(allocSize, bufferImageGranularity);</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">if</span>(allocSize > m_UsableSize)</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>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11896"></a><span class="lineno">11896</span>  }</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> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div> -<div class="line"><a name="l11899"></a><span class="lineno">11899</span>  <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div> -<div class="line"><a name="l11900"></a><span class="lineno">11900</span>  {</div> -<div class="line"><a name="l11901"></a><span class="lineno">11901</span>  <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div> -<div class="line"><a name="l11902"></a><span class="lineno">11902</span>  freeNode != VMA_NULL;</div> -<div class="line"><a name="l11903"></a><span class="lineno">11903</span>  freeNode = freeNode->free.next)</div> -<div class="line"><a name="l11904"></a><span class="lineno">11904</span>  {</div> -<div class="line"><a name="l11905"></a><span class="lineno">11905</span>  <span class="keywordflow">if</span>(freeNode->offset % allocAlignment == 0)</div> -<div class="line"><a name="l11906"></a><span class="lineno">11906</span>  {</div> -<div class="line"><a name="l11907"></a><span class="lineno">11907</span>  pAllocationRequest->type = VmaAllocationRequestType::Normal;</div> -<div class="line"><a name="l11908"></a><span class="lineno">11908</span>  pAllocationRequest->offset = freeNode->offset;</div> -<div class="line"><a name="l11909"></a><span class="lineno">11909</span>  pAllocationRequest->sumFreeSize = LevelToNodeSize(level);</div> -<div class="line"><a name="l11910"></a><span class="lineno">11910</span>  pAllocationRequest->sumItemSize = 0;</div> -<div class="line"><a name="l11911"></a><span class="lineno">11911</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> -<div class="line"><a name="l11912"></a><span class="lineno">11912</span>  pAllocationRequest->customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div> -<div class="line"><a name="l11913"></a><span class="lineno">11913</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l11914"></a><span class="lineno">11914</span>  }</div> -<div class="line"><a name="l11915"></a><span class="lineno">11915</span>  }</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="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l11919"></a><span class="lineno">11919</span> }</div> -<div class="line"><a name="l11920"></a><span class="lineno">11920</span>  </div> -<div class="line"><a name="l11921"></a><span class="lineno">11921</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l11922"></a><span class="lineno">11922</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l11923"></a><span class="lineno">11923</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l11924"></a><span class="lineno">11924</span>  VmaAllocationRequest* pAllocationRequest)</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">/*</span></div> -<div class="line"><a name="l11927"></a><span class="lineno">11927</span> <span class="comment"> Lost allocations are not supported in buddy allocator at the moment.</span></div> -<div class="line"><a name="l11928"></a><span class="lineno">11928</span> <span class="comment"> Support might be added in the future.</span></div> -<div class="line"><a name="l11929"></a><span class="lineno">11929</span> <span class="comment"> */</span></div> -<div class="line"><a name="l11930"></a><span class="lineno">11930</span>  <span class="keywordflow">return</span> pAllocationRequest->itemsToMakeLostCount == 0;</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> uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> -<div class="line"><a name="l11934"></a><span class="lineno">11934</span> {</div> -<div class="line"><a name="l11935"></a><span class="lineno">11935</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l11936"></a><span class="lineno">11936</span> <span class="comment"> Lost allocations are not supported in buddy allocator at the moment.</span></div> -<div class="line"><a name="l11937"></a><span class="lineno">11937</span> <span class="comment"> Support might be added in the future.</span></div> -<div class="line"><a name="l11938"></a><span class="lineno">11938</span> <span class="comment"> */</span></div> -<div class="line"><a name="l11939"></a><span class="lineno">11939</span>  <span class="keywordflow">return</span> 0;</div> -<div class="line"><a name="l11940"></a><span class="lineno">11940</span> }</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="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div> -<div class="line"><a name="l11943"></a><span class="lineno">11943</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> -<div class="line"><a name="l11944"></a><span class="lineno">11944</span>  VmaSuballocationType type,</div> -<div class="line"><a name="l11945"></a><span class="lineno">11945</span>  VkDeviceSize allocSize,</div> -<div class="line"><a name="l11946"></a><span class="lineno">11946</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div> -<div class="line"><a name="l11947"></a><span class="lineno">11947</span> {</div> -<div class="line"><a name="l11948"></a><span class="lineno">11948</span>  VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</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="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div> -<div class="line"><a name="l11951"></a><span class="lineno">11951</span>  uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</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>  Node* currNode = m_FreeList[currLevel].front;</div> -<div class="line"><a name="l11954"></a><span class="lineno">11954</span>  VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);</div> -<div class="line"><a name="l11955"></a><span class="lineno">11955</span>  <span class="keywordflow">while</span>(currNode->offset != request.offset)</div> -<div class="line"><a name="l11956"></a><span class="lineno">11956</span>  {</div> -<div class="line"><a name="l11957"></a><span class="lineno">11957</span>  currNode = currNode->free.next;</div> -<div class="line"><a name="l11958"></a><span class="lineno">11958</span>  VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);</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>  </div> -<div class="line"><a name="l11961"></a><span class="lineno">11961</span>  <span class="comment">// Go down, splitting free nodes.</span></div> -<div class="line"><a name="l11962"></a><span class="lineno">11962</span>  <span class="keywordflow">while</span>(currLevel < targetLevel)</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="comment">// currNode is already first free node at currLevel.</span></div> -<div class="line"><a name="l11965"></a><span class="lineno">11965</span>  <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div> -<div class="line"><a name="l11966"></a><span class="lineno">11966</span>  RemoveFromFreeList(currLevel, currNode);</div> -<div class="line"><a name="l11967"></a><span class="lineno">11967</span>  </div> -<div class="line"><a name="l11968"></a><span class="lineno">11968</span>  <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</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="comment">// Create two free sub-nodes.</span></div> -<div class="line"><a name="l11971"></a><span class="lineno">11971</span>  Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div> -<div class="line"><a name="l11972"></a><span class="lineno">11972</span>  Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div> -<div class="line"><a name="l11973"></a><span class="lineno">11973</span>  </div> -<div class="line"><a name="l11974"></a><span class="lineno">11974</span>  leftChild->offset = currNode->offset;</div> -<div class="line"><a name="l11975"></a><span class="lineno">11975</span>  leftChild->type = Node::TYPE_FREE;</div> -<div class="line"><a name="l11976"></a><span class="lineno">11976</span>  leftChild->parent = currNode;</div> -<div class="line"><a name="l11977"></a><span class="lineno">11977</span>  leftChild->buddy = rightChild;</div> -<div class="line"><a name="l11978"></a><span class="lineno">11978</span>  </div> -<div class="line"><a name="l11979"></a><span class="lineno">11979</span>  rightChild->offset = currNode->offset + LevelToNodeSize(childrenLevel);</div> -<div class="line"><a name="l11980"></a><span class="lineno">11980</span>  rightChild->type = Node::TYPE_FREE;</div> -<div class="line"><a name="l11981"></a><span class="lineno">11981</span>  rightChild->parent = currNode;</div> -<div class="line"><a name="l11982"></a><span class="lineno">11982</span>  rightChild->buddy = leftChild;</div> -<div class="line"><a name="l11983"></a><span class="lineno">11983</span>  </div> -<div class="line"><a name="l11984"></a><span class="lineno">11984</span>  <span class="comment">// Convert current currNode to split type.</span></div> -<div class="line"><a name="l11985"></a><span class="lineno">11985</span>  currNode->type = Node::TYPE_SPLIT;</div> -<div class="line"><a name="l11986"></a><span class="lineno">11986</span>  currNode->split.leftChild = leftChild;</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="comment">// Add child nodes to free list. Order is important!</span></div> -<div class="line"><a name="l11989"></a><span class="lineno">11989</span>  AddToFreeListFront(childrenLevel, rightChild);</div> -<div class="line"><a name="l11990"></a><span class="lineno">11990</span>  AddToFreeListFront(childrenLevel, leftChild);</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>  ++m_FreeCount;</div> -<div class="line"><a name="l11993"></a><span class="lineno">11993</span>  <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div> -<div class="line"><a name="l11994"></a><span class="lineno">11994</span>  ++currLevel;</div> -<div class="line"><a name="l11995"></a><span class="lineno">11995</span>  currNode = m_FreeList[currLevel].front;</div> -<div class="line"><a name="l11996"></a><span class="lineno">11996</span>  </div> -<div class="line"><a name="l11997"></a><span class="lineno">11997</span>  <span class="comment">/*</span></div> -<div class="line"><a name="l11998"></a><span class="lineno">11998</span> <span class="comment"> We can be sure that currNode, as left child of node previously split,</span></div> -<div class="line"><a name="l11999"></a><span class="lineno">11999</span> <span class="comment"> also fullfills the alignment requirement.</span></div> -<div class="line"><a name="l12000"></a><span class="lineno">12000</span> <span class="comment"> */</span></div> -<div class="line"><a name="l12001"></a><span class="lineno">12001</span>  }</div> -<div class="line"><a name="l12002"></a><span class="lineno">12002</span>  </div> -<div class="line"><a name="l12003"></a><span class="lineno">12003</span>  <span class="comment">// Remove from free list.</span></div> -<div class="line"><a name="l12004"></a><span class="lineno">12004</span>  VMA_ASSERT(currLevel == targetLevel &&</div> -<div class="line"><a name="l12005"></a><span class="lineno">12005</span>  currNode != VMA_NULL &&</div> -<div class="line"><a name="l12006"></a><span class="lineno">12006</span>  currNode->type == Node::TYPE_FREE);</div> -<div class="line"><a name="l12007"></a><span class="lineno">12007</span>  RemoveFromFreeList(currLevel, currNode);</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>  <span class="comment">// Convert to allocation node.</span></div> -<div class="line"><a name="l12010"></a><span class="lineno">12010</span>  currNode->type = Node::TYPE_ALLOCATION;</div> -<div class="line"><a name="l12011"></a><span class="lineno">12011</span>  currNode->allocation.alloc = hAllocation;</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>  ++m_AllocationCount;</div> -<div class="line"><a name="l12014"></a><span class="lineno">12014</span>  --m_FreeCount;</div> -<div class="line"><a name="l12015"></a><span class="lineno">12015</span>  m_SumFreeSize -= allocSize;</div> -<div class="line"><a name="l12016"></a><span class="lineno">12016</span> }</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> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</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">if</span>(node->type == Node::TYPE_SPLIT)</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>  DeleteNode(node->split.leftChild->buddy);</div> -<div class="line"><a name="l12023"></a><span class="lineno">12023</span>  DeleteNode(node->split.leftChild);</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>  </div> -<div class="line"><a name="l12026"></a><span class="lineno">12026</span>  vma_delete(GetAllocationCallbacks(), node);</div> -<div class="line"><a name="l12027"></a><span class="lineno">12027</span> }</div> -<div class="line"><a name="l12028"></a><span class="lineno">12028</span>  </div> -<div class="line"><a name="l12029"></a><span class="lineno">12029</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext& ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l12030"></a><span class="lineno">12030</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12031"></a><span class="lineno">12031</span>  VMA_VALIDATE(level < m_LevelCount);</div> -<div class="line"><a name="l12032"></a><span class="lineno">12032</span>  VMA_VALIDATE(curr->parent == parent);</div> -<div class="line"><a name="l12033"></a><span class="lineno">12033</span>  VMA_VALIDATE((curr->buddy == VMA_NULL) == (parent == VMA_NULL));</div> -<div class="line"><a name="l12034"></a><span class="lineno">12034</span>  VMA_VALIDATE(curr->buddy == VMA_NULL || curr->buddy->buddy == curr);</div> -<div class="line"><a name="l12035"></a><span class="lineno">12035</span>  <span class="keywordflow">switch</span>(curr->type)</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>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> -<div class="line"><a name="l12038"></a><span class="lineno">12038</span>  <span class="comment">// curr->free.prev, next are validated separately.</span></div> -<div class="line"><a name="l12039"></a><span class="lineno">12039</span>  ctx.calculatedSumFreeSize += levelNodeSize;</div> -<div class="line"><a name="l12040"></a><span class="lineno">12040</span>  ++ctx.calculatedFreeCount;</div> -<div class="line"><a name="l12041"></a><span class="lineno">12041</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12042"></a><span class="lineno">12042</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div> -<div class="line"><a name="l12043"></a><span class="lineno">12043</span>  ++ctx.calculatedAllocationCount;</div> -<div class="line"><a name="l12044"></a><span class="lineno">12044</span>  ctx.calculatedSumFreeSize += levelNodeSize - curr->allocation.alloc->GetSize();</div> -<div class="line"><a name="l12045"></a><span class="lineno">12045</span>  VMA_VALIDATE(curr->allocation.alloc != VK_NULL_HANDLE);</div> -<div class="line"><a name="l12046"></a><span class="lineno">12046</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12047"></a><span class="lineno">12047</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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="keyword">const</span> uint32_t childrenLevel = level + 1;</div> -<div class="line"><a name="l12050"></a><span class="lineno">12050</span>  <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div> -<div class="line"><a name="l12051"></a><span class="lineno">12051</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr->split.leftChild;</div> -<div class="line"><a name="l12052"></a><span class="lineno">12052</span>  VMA_VALIDATE(leftChild != VMA_NULL);</div> -<div class="line"><a name="l12053"></a><span class="lineno">12053</span>  VMA_VALIDATE(leftChild->offset == curr->offset);</div> -<div class="line"><a name="l12054"></a><span class="lineno">12054</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</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>  VMA_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode for left child failed."</span>);</div> -<div class="line"><a name="l12057"></a><span class="lineno">12057</span>  }</div> -<div class="line"><a name="l12058"></a><span class="lineno">12058</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> -<div class="line"><a name="l12059"></a><span class="lineno">12059</span>  VMA_VALIDATE(rightChild->offset == curr->offset + childrenLevelNodeSize);</div> -<div class="line"><a name="l12060"></a><span class="lineno">12060</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</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>  VMA_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode for right child failed."</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>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12066"></a><span class="lineno">12066</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l12067"></a><span class="lineno">12067</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l12068"></a><span class="lineno">12068</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>  <span class="keywordflow">return</span> <span class="keyword">true</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> uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l12074"></a><span class="lineno">12074</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12075"></a><span class="lineno">12075</span>  <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div> -<div class="line"><a name="l12076"></a><span class="lineno">12076</span>  uint32_t level = 0;</div> -<div class="line"><a name="l12077"></a><span class="lineno">12077</span>  VkDeviceSize currLevelNodeSize = m_UsableSize;</div> -<div class="line"><a name="l12078"></a><span class="lineno">12078</span>  VkDeviceSize nextLevelNodeSize = currLevelNodeSize >> 1;</div> -<div class="line"><a name="l12079"></a><span class="lineno">12079</span>  <span class="keywordflow">while</span>(allocSize <= nextLevelNodeSize && level + 1 < m_LevelCount)</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>  ++level;</div> -<div class="line"><a name="l12082"></a><span class="lineno">12082</span>  currLevelNodeSize = nextLevelNodeSize;</div> -<div class="line"><a name="l12083"></a><span class="lineno">12083</span>  nextLevelNodeSize = currLevelNodeSize >> 1;</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">return</span> level;</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> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div> -<div class="line"><a name="l12089"></a><span class="lineno">12089</span> {</div> -<div class="line"><a name="l12090"></a><span class="lineno">12090</span>  <span class="comment">// Find node and level.</span></div> -<div class="line"><a name="l12091"></a><span class="lineno">12091</span>  Node* node = m_Root;</div> -<div class="line"><a name="l12092"></a><span class="lineno">12092</span>  VkDeviceSize nodeOffset = 0;</div> -<div class="line"><a name="l12093"></a><span class="lineno">12093</span>  uint32_t level = 0;</div> -<div class="line"><a name="l12094"></a><span class="lineno">12094</span>  VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div> -<div class="line"><a name="l12095"></a><span class="lineno">12095</span>  <span class="keywordflow">while</span>(node->type == Node::TYPE_SPLIT)</div> -<div class="line"><a name="l12096"></a><span class="lineno">12096</span>  {</div> -<div class="line"><a name="l12097"></a><span class="lineno">12097</span>  <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize >> 1;</div> -<div class="line"><a name="l12098"></a><span class="lineno">12098</span>  <span class="keywordflow">if</span>(offset < nodeOffset + nextLevelSize)</div> -<div class="line"><a name="l12099"></a><span class="lineno">12099</span>  {</div> -<div class="line"><a name="l12100"></a><span class="lineno">12100</span>  node = node->split.leftChild;</div> -<div class="line"><a name="l12101"></a><span class="lineno">12101</span>  }</div> -<div class="line"><a name="l12102"></a><span class="lineno">12102</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l12103"></a><span class="lineno">12103</span>  {</div> -<div class="line"><a name="l12104"></a><span class="lineno">12104</span>  node = node->split.leftChild->buddy;</div> -<div class="line"><a name="l12105"></a><span class="lineno">12105</span>  nodeOffset += nextLevelSize;</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>  ++level;</div> -<div class="line"><a name="l12108"></a><span class="lineno">12108</span>  levelNodeSize = nextLevelSize;</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>  </div> -<div class="line"><a name="l12111"></a><span class="lineno">12111</span>  VMA_ASSERT(node != VMA_NULL && node->type == Node::TYPE_ALLOCATION);</div> -<div class="line"><a name="l12112"></a><span class="lineno">12112</span>  VMA_ASSERT(alloc == VK_NULL_HANDLE || node->allocation.alloc == alloc);</div> -<div class="line"><a name="l12113"></a><span class="lineno">12113</span>  </div> -<div class="line"><a name="l12114"></a><span class="lineno">12114</span>  ++m_FreeCount;</div> -<div class="line"><a name="l12115"></a><span class="lineno">12115</span>  --m_AllocationCount;</div> -<div class="line"><a name="l12116"></a><span class="lineno">12116</span>  m_SumFreeSize += alloc->GetSize();</div> +<div class="line"><a name="l11856"></a><span class="lineno">11856</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div> +<div class="line"><a name="l11857"></a><span class="lineno">11857</span> {</div> +<div class="line"><a name="l11858"></a><span class="lineno">11858</span>  FreeAtOffset(allocation->GetOffset());</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>  </div> +<div class="line"><a name="l11861"></a><span class="lineno">11861</span> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</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>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11864"></a><span class="lineno">11864</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</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>  <span class="keywordflow">if</span>(!suballocations1st.empty())</div> +<div class="line"><a name="l11867"></a><span class="lineno">11867</span>  {</div> +<div class="line"><a name="l11868"></a><span class="lineno">11868</span>  <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div> +<div class="line"><a name="l11869"></a><span class="lineno">11869</span>  VmaSuballocation& firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div> +<div class="line"><a name="l11870"></a><span class="lineno">11870</span>  <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</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>  firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11873"></a><span class="lineno">11873</span>  firstSuballoc.hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11874"></a><span class="lineno">11874</span>  m_SumFreeSize += firstSuballoc.size;</div> +<div class="line"><a name="l11875"></a><span class="lineno">11875</span>  ++m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l11876"></a><span class="lineno">11876</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11877"></a><span class="lineno">11877</span>  <span class="keywordflow">return</span>;</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>  }</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>  <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div> +<div class="line"><a name="l11882"></a><span class="lineno">11882</span>  <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div> +<div class="line"><a name="l11883"></a><span class="lineno">11883</span>  m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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>  VmaSuballocation& lastSuballoc = suballocations2nd.back();</div> +<div class="line"><a name="l11886"></a><span class="lineno">11886</span>  <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</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>  m_SumFreeSize += lastSuballoc.size;</div> +<div class="line"><a name="l11889"></a><span class="lineno">11889</span>  suballocations2nd.pop_back();</div> +<div class="line"><a name="l11890"></a><span class="lineno">11890</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11891"></a><span class="lineno">11891</span>  <span class="keywordflow">return</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>  }</div> +<div class="line"><a name="l11894"></a><span class="lineno">11894</span>  <span class="comment">// Last allocation in 1st vector.</span></div> +<div class="line"><a name="l11895"></a><span class="lineno">11895</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</div> +<div class="line"><a name="l11896"></a><span class="lineno">11896</span>  {</div> +<div class="line"><a name="l11897"></a><span class="lineno">11897</span>  VmaSuballocation& lastSuballoc = suballocations1st.back();</div> +<div class="line"><a name="l11898"></a><span class="lineno">11898</span>  <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div> +<div class="line"><a name="l11899"></a><span class="lineno">11899</span>  {</div> +<div class="line"><a name="l11900"></a><span class="lineno">11900</span>  m_SumFreeSize += lastSuballoc.size;</div> +<div class="line"><a name="l11901"></a><span class="lineno">11901</span>  suballocations1st.pop_back();</div> +<div class="line"><a name="l11902"></a><span class="lineno">11902</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11903"></a><span class="lineno">11903</span>  <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l11904"></a><span class="lineno">11904</span>  }</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>  </div> +<div class="line"><a name="l11907"></a><span class="lineno">11907</span>  <span class="comment">// Item from the middle of 1st vector.</span></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>  VmaSuballocation refSuballoc;</div> +<div class="line"><a name="l11910"></a><span class="lineno">11910</span>  refSuballoc.offset = offset;</div> +<div class="line"><a name="l11911"></a><span class="lineno">11911</span>  <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div> +<div class="line"><a name="l11912"></a><span class="lineno">11912</span>  SuballocationVectorType::iterator it = VmaBinaryFindSorted(</div> +<div class="line"><a name="l11913"></a><span class="lineno">11913</span>  suballocations1st.begin() + m_1stNullItemsBeginCount,</div> +<div class="line"><a name="l11914"></a><span class="lineno">11914</span>  suballocations1st.end(),</div> +<div class="line"><a name="l11915"></a><span class="lineno">11915</span>  refSuballoc,</div> +<div class="line"><a name="l11916"></a><span class="lineno">11916</span>  VmaSuballocationOffsetLess());</div> +<div class="line"><a name="l11917"></a><span class="lineno">11917</span>  <span class="keywordflow">if</span>(it != suballocations1st.end())</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>  it->type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11920"></a><span class="lineno">11920</span>  it->hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11921"></a><span class="lineno">11921</span>  ++m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11922"></a><span class="lineno">11922</span>  m_SumFreeSize += it->size;</div> +<div class="line"><a name="l11923"></a><span class="lineno">11923</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11924"></a><span class="lineno">11924</span>  <span class="keywordflow">return</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>  }</div> +<div class="line"><a name="l11927"></a><span class="lineno">11927</span>  </div> +<div class="line"><a name="l11928"></a><span class="lineno">11928</span>  <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</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="comment">// Item from the middle of 2nd vector.</span></div> +<div class="line"><a name="l11931"></a><span class="lineno">11931</span>  VmaSuballocation refSuballoc;</div> +<div class="line"><a name="l11932"></a><span class="lineno">11932</span>  refSuballoc.offset = offset;</div> +<div class="line"><a name="l11933"></a><span class="lineno">11933</span>  <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div> +<div class="line"><a name="l11934"></a><span class="lineno">11934</span>  SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div> +<div class="line"><a name="l11935"></a><span class="lineno">11935</span>  VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetLess()) :</div> +<div class="line"><a name="l11936"></a><span class="lineno">11936</span>  VmaBinaryFindSorted(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc, VmaSuballocationOffsetGreater());</div> +<div class="line"><a name="l11937"></a><span class="lineno">11937</span>  <span class="keywordflow">if</span>(it != suballocations2nd.end())</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>  it->type = VMA_SUBALLOCATION_TYPE_FREE;</div> +<div class="line"><a name="l11940"></a><span class="lineno">11940</span>  it->hAllocation = VK_NULL_HANDLE;</div> +<div class="line"><a name="l11941"></a><span class="lineno">11941</span>  ++m_2ndNullItemsCount;</div> +<div class="line"><a name="l11942"></a><span class="lineno">11942</span>  m_SumFreeSize += it->size;</div> +<div class="line"><a name="l11943"></a><span class="lineno">11943</span>  CleanupAfterFree();</div> +<div class="line"><a name="l11944"></a><span class="lineno">11944</span>  <span class="keywordflow">return</span>;</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>  </div> +<div class="line"><a name="l11948"></a><span class="lineno">11948</span>  VMA_ASSERT(0 && <span class="stringliteral">"Allocation to free not found in linear allocator!"</span>);</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>  </div> +<div class="line"><a name="l11951"></a><span class="lineno">11951</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div> +<div class="line"><a name="l11952"></a><span class="lineno">11952</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l11953"></a><span class="lineno">11953</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11954"></a><span class="lineno">11954</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div> +<div class="line"><a name="l11955"></a><span class="lineno">11955</span>  <span class="keywordflow">return</span> suballocCount > 32 && nullItemCount * 2 >= (suballocCount - nullItemCount) * 3;</div> +<div class="line"><a name="l11956"></a><span class="lineno">11956</span> }</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> <span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</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>  SuballocationVectorType& suballocations1st = AccessSuballocations1st();</div> +<div class="line"><a name="l11961"></a><span class="lineno">11961</span>  SuballocationVectorType& suballocations2nd = AccessSuballocations2nd();</div> +<div class="line"><a name="l11962"></a><span class="lineno">11962</span>  </div> +<div class="line"><a name="l11963"></a><span class="lineno">11963</span>  <span class="keywordflow">if</span>(IsEmpty())</div> +<div class="line"><a name="l11964"></a><span class="lineno">11964</span>  {</div> +<div class="line"><a name="l11965"></a><span class="lineno">11965</span>  suballocations1st.clear();</div> +<div class="line"><a name="l11966"></a><span class="lineno">11966</span>  suballocations2nd.clear();</div> +<div class="line"><a name="l11967"></a><span class="lineno">11967</span>  m_1stNullItemsBeginCount = 0;</div> +<div class="line"><a name="l11968"></a><span class="lineno">11968</span>  m_1stNullItemsMiddleCount = 0;</div> +<div class="line"><a name="l11969"></a><span class="lineno">11969</span>  m_2ndNullItemsCount = 0;</div> +<div class="line"><a name="l11970"></a><span class="lineno">11970</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</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="keywordflow">else</span></div> +<div class="line"><a name="l11973"></a><span class="lineno">11973</span>  {</div> +<div class="line"><a name="l11974"></a><span class="lineno">11974</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div> +<div class="line"><a name="l11975"></a><span class="lineno">11975</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11976"></a><span class="lineno">11976</span>  VMA_ASSERT(nullItem1stCount <= suballoc1stCount);</div> +<div class="line"><a name="l11977"></a><span class="lineno">11977</span>  </div> +<div class="line"><a name="l11978"></a><span class="lineno">11978</span>  <span class="comment">// Find more null items at the beginning of 1st vector.</span></div> +<div class="line"><a name="l11979"></a><span class="lineno">11979</span>  <span class="keywordflow">while</span>(m_1stNullItemsBeginCount < suballoc1stCount &&</div> +<div class="line"><a name="l11980"></a><span class="lineno">11980</span>  suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l11981"></a><span class="lineno">11981</span>  {</div> +<div class="line"><a name="l11982"></a><span class="lineno">11982</span>  ++m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l11983"></a><span class="lineno">11983</span>  --m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11984"></a><span class="lineno">11984</span>  }</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>  <span class="comment">// Find more null items at the end of 1st vector.</span></div> +<div class="line"><a name="l11987"></a><span class="lineno">11987</span>  <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount > 0 &&</div> +<div class="line"><a name="l11988"></a><span class="lineno">11988</span>  suballocations1st.back().hAllocation == VK_NULL_HANDLE)</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>  --m_1stNullItemsMiddleCount;</div> +<div class="line"><a name="l11991"></a><span class="lineno">11991</span>  suballocations1st.pop_back();</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="comment">// Find more null items at the end of 2nd vector.</span></div> +<div class="line"><a name="l11995"></a><span class="lineno">11995</span>  <span class="keywordflow">while</span>(m_2ndNullItemsCount > 0 &&</div> +<div class="line"><a name="l11996"></a><span class="lineno">11996</span>  suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</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>  --m_2ndNullItemsCount;</div> +<div class="line"><a name="l11999"></a><span class="lineno">11999</span>  suballocations2nd.pop_back();</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>  </div> +<div class="line"><a name="l12002"></a><span class="lineno">12002</span>  <span class="comment">// Find more null items at the beginning of 2nd vector.</span></div> +<div class="line"><a name="l12003"></a><span class="lineno">12003</span>  <span class="keywordflow">while</span>(m_2ndNullItemsCount > 0 &&</div> +<div class="line"><a name="l12004"></a><span class="lineno">12004</span>  suballocations2nd[0].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l12005"></a><span class="lineno">12005</span>  {</div> +<div class="line"><a name="l12006"></a><span class="lineno">12006</span>  --m_2ndNullItemsCount;</div> +<div class="line"><a name="l12007"></a><span class="lineno">12007</span>  VmaVectorRemove(suballocations2nd, 0);</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>  </div> +<div class="line"><a name="l12010"></a><span class="lineno">12010</span>  <span class="keywordflow">if</span>(ShouldCompact1st())</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>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div> +<div class="line"><a name="l12013"></a><span class="lineno">12013</span>  <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l12014"></a><span class="lineno">12014</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex < nonNullItemCount; ++dstIndex)</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="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</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>  ++srcIndex;</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">if</span>(dstIndex != srcIndex)</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>  suballocations1st[dstIndex] = suballocations1st[srcIndex];</div> +<div class="line"><a name="l12023"></a><span class="lineno">12023</span>  }</div> +<div class="line"><a name="l12024"></a><span class="lineno">12024</span>  ++srcIndex;</div> +<div class="line"><a name="l12025"></a><span class="lineno">12025</span>  }</div> +<div class="line"><a name="l12026"></a><span class="lineno">12026</span>  suballocations1st.resize(nonNullItemCount);</div> +<div class="line"><a name="l12027"></a><span class="lineno">12027</span>  m_1stNullItemsBeginCount = 0;</div> +<div class="line"><a name="l12028"></a><span class="lineno">12028</span>  m_1stNullItemsMiddleCount = 0;</div> +<div class="line"><a name="l12029"></a><span class="lineno">12029</span>  }</div> +<div class="line"><a name="l12030"></a><span class="lineno">12030</span>  </div> +<div class="line"><a name="l12031"></a><span class="lineno">12031</span>  <span class="comment">// 2nd vector became empty.</span></div> +<div class="line"><a name="l12032"></a><span class="lineno">12032</span>  <span class="keywordflow">if</span>(suballocations2nd.empty())</div> +<div class="line"><a name="l12033"></a><span class="lineno">12033</span>  {</div> +<div class="line"><a name="l12034"></a><span class="lineno">12034</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</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>  <span class="comment">// 1st vector became empty.</span></div> +<div class="line"><a name="l12038"></a><span class="lineno">12038</span>  <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</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>  suballocations1st.clear();</div> +<div class="line"><a name="l12041"></a><span class="lineno">12041</span>  m_1stNullItemsBeginCount = 0;</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="keywordflow">if</span>(!suballocations2nd.empty() && m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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>  <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div> +<div class="line"><a name="l12046"></a><span class="lineno">12046</span>  m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div> +<div class="line"><a name="l12047"></a><span class="lineno">12047</span>  m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div> +<div class="line"><a name="l12048"></a><span class="lineno">12048</span>  <span class="keywordflow">while</span>(m_1stNullItemsBeginCount < suballocations2nd.size() &&</div> +<div class="line"><a name="l12049"></a><span class="lineno">12049</span>  suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div> +<div class="line"><a name="l12050"></a><span class="lineno">12050</span>  {</div> +<div class="line"><a name="l12051"></a><span class="lineno">12051</span>  ++m_1stNullItemsBeginCount;</div> +<div class="line"><a name="l12052"></a><span class="lineno">12052</span>  --m_1stNullItemsMiddleCount;</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>  m_2ndNullItemsCount = 0;</div> +<div class="line"><a name="l12055"></a><span class="lineno">12055</span>  m_1stVectorIndex ^= 1;</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>  }</div> +<div class="line"><a name="l12058"></a><span class="lineno">12058</span>  }</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>  VMA_HEAVY_ASSERT(Validate());</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>  </div> +<div class="line"><a name="l12063"></a><span class="lineno">12063</span>  </div> +<div class="line"><a name="l12065"></a><span class="lineno">12065</span> <span class="comment">// class VmaBlockMetadata_Buddy</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> VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> +<div class="line"><a name="l12068"></a><span class="lineno">12068</span>  VmaBlockMetadata(hAllocator),</div> +<div class="line"><a name="l12069"></a><span class="lineno">12069</span>  m_Root(VMA_NULL),</div> +<div class="line"><a name="l12070"></a><span class="lineno">12070</span>  m_AllocationCount(0),</div> +<div class="line"><a name="l12071"></a><span class="lineno">12071</span>  m_FreeCount(1),</div> +<div class="line"><a name="l12072"></a><span class="lineno">12072</span>  m_SumFreeSize(0)</div> +<div class="line"><a name="l12073"></a><span class="lineno">12073</span> {</div> +<div class="line"><a name="l12074"></a><span class="lineno">12074</span>  memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div> +<div class="line"><a name="l12075"></a><span class="lineno">12075</span> }</div> +<div class="line"><a name="l12076"></a><span class="lineno">12076</span>  </div> +<div class="line"><a name="l12077"></a><span class="lineno">12077</span> VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</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>  DeleteNode(m_Root);</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>  </div> +<div class="line"><a name="l12082"></a><span class="lineno">12082</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize 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>  VmaBlockMetadata::Init(size);</div> +<div class="line"><a name="l12085"></a><span class="lineno">12085</span>  </div> +<div class="line"><a name="l12086"></a><span class="lineno">12086</span>  m_UsableSize = VmaPrevPow2(size);</div> +<div class="line"><a name="l12087"></a><span class="lineno">12087</span>  m_SumFreeSize = m_UsableSize;</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="comment">// Calculate m_LevelCount.</span></div> +<div class="line"><a name="l12090"></a><span class="lineno">12090</span>  m_LevelCount = 1;</div> +<div class="line"><a name="l12091"></a><span class="lineno">12091</span>  <span class="keywordflow">while</span>(m_LevelCount < MAX_LEVELS &&</div> +<div class="line"><a name="l12092"></a><span class="lineno">12092</span>  LevelToNodeSize(m_LevelCount) >= MIN_NODE_SIZE)</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>  ++m_LevelCount;</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>  </div> +<div class="line"><a name="l12097"></a><span class="lineno">12097</span>  Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div> +<div class="line"><a name="l12098"></a><span class="lineno">12098</span>  rootNode->offset = 0;</div> +<div class="line"><a name="l12099"></a><span class="lineno">12099</span>  rootNode->type = Node::TYPE_FREE;</div> +<div class="line"><a name="l12100"></a><span class="lineno">12100</span>  rootNode->parent = VMA_NULL;</div> +<div class="line"><a name="l12101"></a><span class="lineno">12101</span>  rootNode->buddy = VMA_NULL;</div> +<div class="line"><a name="l12102"></a><span class="lineno">12102</span>  </div> +<div class="line"><a name="l12103"></a><span class="lineno">12103</span>  m_Root = rootNode;</div> +<div class="line"><a name="l12104"></a><span class="lineno">12104</span>  AddToFreeListFront(0, rootNode);</div> +<div class="line"><a name="l12105"></a><span class="lineno">12105</span> }</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> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div> +<div class="line"><a name="l12108"></a><span class="lineno">12108</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12109"></a><span class="lineno">12109</span>  <span class="comment">// Validate tree.</span></div> +<div class="line"><a name="l12110"></a><span class="lineno">12110</span>  ValidationContext ctx;</div> +<div class="line"><a name="l12111"></a><span class="lineno">12111</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</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_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode failed."</span>);</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>  VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div> +<div class="line"><a name="l12116"></a><span class="lineno">12116</span>  VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</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>  node->type = Node::TYPE_FREE;</div> -<div class="line"><a name="l12119"></a><span class="lineno">12119</span>  </div> -<div class="line"><a name="l12120"></a><span class="lineno">12120</span>  <span class="comment">// Join free nodes if possible.</span></div> -<div class="line"><a name="l12121"></a><span class="lineno">12121</span>  <span class="keywordflow">while</span>(level > 0 && node->buddy->type == Node::TYPE_FREE)</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>  RemoveFromFreeList(level, node->buddy);</div> -<div class="line"><a name="l12124"></a><span class="lineno">12124</span>  Node* <span class="keyword">const</span> parent = node->parent;</div> -<div class="line"><a name="l12125"></a><span class="lineno">12125</span>  </div> -<div class="line"><a name="l12126"></a><span class="lineno">12126</span>  vma_delete(GetAllocationCallbacks(), node->buddy);</div> -<div class="line"><a name="l12127"></a><span class="lineno">12127</span>  vma_delete(GetAllocationCallbacks(), node);</div> -<div class="line"><a name="l12128"></a><span class="lineno">12128</span>  parent->type = Node::TYPE_FREE;</div> -<div class="line"><a name="l12129"></a><span class="lineno">12129</span>  </div> -<div class="line"><a name="l12130"></a><span class="lineno">12130</span>  node = parent;</div> -<div class="line"><a name="l12131"></a><span class="lineno">12131</span>  --level;</div> -<div class="line"><a name="l12132"></a><span class="lineno">12132</span>  <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div> -<div class="line"><a name="l12133"></a><span class="lineno">12133</span>  --m_FreeCount;</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>  </div> -<div class="line"><a name="l12136"></a><span class="lineno">12136</span>  AddToFreeListFront(level, node);</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>  </div> -<div class="line"><a name="l12139"></a><span class="lineno">12139</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l12140"></a><span class="lineno">12140</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12141"></a><span class="lineno">12141</span>  <span class="keywordflow">switch</span>(node->type)</div> -<div class="line"><a name="l12142"></a><span class="lineno">12142</span>  {</div> -<div class="line"><a name="l12143"></a><span class="lineno">12143</span>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> -<div class="line"><a name="l12144"></a><span class="lineno">12144</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l12145"></a><span class="lineno">12145</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div> -<div class="line"><a name="l12146"></a><span class="lineno">12146</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, levelNodeSize);</div> -<div class="line"><a name="l12147"></a><span class="lineno">12147</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div> -<div class="line"><a name="l12148"></a><span class="lineno">12148</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12149"></a><span class="lineno">12149</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div> -<div class="line"><a name="l12150"></a><span class="lineno">12150</span>  {</div> -<div class="line"><a name="l12151"></a><span class="lineno">12151</span>  <span class="keyword">const</span> VkDeviceSize allocSize = node->allocation.alloc->GetSize();</div> -<div class="line"><a name="l12152"></a><span class="lineno">12152</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> -<div class="line"><a name="l12153"></a><span class="lineno">12153</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div> -<div class="line"><a name="l12154"></a><span class="lineno">12154</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, allocSize);</div> -<div class="line"><a name="l12155"></a><span class="lineno">12155</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div> -<div class="line"><a name="l12156"></a><span class="lineno">12156</span>  </div> -<div class="line"><a name="l12157"></a><span class="lineno">12157</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div> -<div class="line"><a name="l12158"></a><span class="lineno">12158</span>  <span class="keywordflow">if</span>(unusedRangeSize > 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>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l12161"></a><span class="lineno">12161</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> -<div class="line"><a name="l12162"></a><span class="lineno">12162</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> -<div class="line"><a name="l12163"></a><span class="lineno">12163</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> -<div class="line"><a name="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">break</span>;</div> -<div class="line"><a name="l12167"></a><span class="lineno">12167</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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>  <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div> -<div class="line"><a name="l12170"></a><span class="lineno">12170</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node->split.leftChild;</div> -<div class="line"><a name="l12171"></a><span class="lineno">12171</span>  CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div> -<div class="line"><a name="l12172"></a><span class="lineno">12172</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> -<div class="line"><a name="l12173"></a><span class="lineno">12173</span>  CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div> -<div class="line"><a name="l12174"></a><span class="lineno">12174</span>  }</div> -<div class="line"><a name="l12175"></a><span class="lineno">12175</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12176"></a><span class="lineno">12176</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l12177"></a><span class="lineno">12177</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l12178"></a><span class="lineno">12178</span>  }</div> -<div class="line"><a name="l12179"></a><span class="lineno">12179</span> }</div> -<div class="line"><a name="l12180"></a><span class="lineno">12180</span>  </div> -<div class="line"><a name="l12181"></a><span class="lineno">12181</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div> -<div class="line"><a name="l12182"></a><span class="lineno">12182</span> {</div> -<div class="line"><a name="l12183"></a><span class="lineno">12183</span>  VMA_ASSERT(node->type == Node::TYPE_FREE);</div> -<div class="line"><a name="l12184"></a><span class="lineno">12184</span>  </div> -<div class="line"><a name="l12185"></a><span class="lineno">12185</span>  <span class="comment">// List is empty.</span></div> -<div class="line"><a name="l12186"></a><span class="lineno">12186</span>  Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div> -<div class="line"><a name="l12187"></a><span class="lineno">12187</span>  <span class="keywordflow">if</span>(frontNode == VMA_NULL)</div> -<div class="line"><a name="l12188"></a><span class="lineno">12188</span>  {</div> -<div class="line"><a name="l12189"></a><span class="lineno">12189</span>  VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div> -<div class="line"><a name="l12190"></a><span class="lineno">12190</span>  node->free.prev = node->free.next = VMA_NULL;</div> -<div class="line"><a name="l12191"></a><span class="lineno">12191</span>  m_FreeList[level].front = m_FreeList[level].back = node;</div> -<div class="line"><a name="l12192"></a><span class="lineno">12192</span>  }</div> -<div class="line"><a name="l12193"></a><span class="lineno">12193</span>  <span class="keywordflow">else</span></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>  VMA_ASSERT(frontNode->free.prev == VMA_NULL);</div> -<div class="line"><a name="l12196"></a><span class="lineno">12196</span>  node->free.prev = VMA_NULL;</div> -<div class="line"><a name="l12197"></a><span class="lineno">12197</span>  node->free.next = frontNode;</div> -<div class="line"><a name="l12198"></a><span class="lineno">12198</span>  frontNode->free.prev = node;</div> -<div class="line"><a name="l12199"></a><span class="lineno">12199</span>  m_FreeList[level].front = node;</div> +<div class="line"><a name="l12118"></a><span class="lineno">12118</span>  <span class="comment">// Validate free node lists.</span></div> +<div class="line"><a name="l12119"></a><span class="lineno">12119</span>  <span class="keywordflow">for</span>(uint32_t level = 0; level < m_LevelCount; ++level)</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>  VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div> +<div class="line"><a name="l12122"></a><span class="lineno">12122</span>  m_FreeList[level].front->free.prev == VMA_NULL);</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>  <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div> +<div class="line"><a name="l12125"></a><span class="lineno">12125</span>  node != VMA_NULL;</div> +<div class="line"><a name="l12126"></a><span class="lineno">12126</span>  node = node->free.next)</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>  VMA_VALIDATE(node->type == Node::TYPE_FREE);</div> +<div class="line"><a name="l12129"></a><span class="lineno">12129</span>  </div> +<div class="line"><a name="l12130"></a><span class="lineno">12130</span>  <span class="keywordflow">if</span>(node->free.next == VMA_NULL)</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>  VMA_VALIDATE(m_FreeList[level].back == node);</div> +<div class="line"><a name="l12133"></a><span class="lineno">12133</span>  }</div> +<div class="line"><a name="l12134"></a><span class="lineno">12134</span>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l12135"></a><span class="lineno">12135</span>  {</div> +<div class="line"><a name="l12136"></a><span class="lineno">12136</span>  VMA_VALIDATE(node->free.next->free.prev == node);</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>  }</div> +<div class="line"><a name="l12139"></a><span class="lineno">12139</span>  }</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>  <span class="comment">// Validate that free lists ar higher levels are empty.</span></div> +<div class="line"><a name="l12142"></a><span class="lineno">12142</span>  <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level < MAX_LEVELS; ++level)</div> +<div class="line"><a name="l12143"></a><span class="lineno">12143</span>  {</div> +<div class="line"><a name="l12144"></a><span class="lineno">12144</span>  VMA_VALIDATE(m_FreeList[level].front == VMA_NULL && m_FreeList[level].back == VMA_NULL);</div> +<div class="line"><a name="l12145"></a><span class="lineno">12145</span>  }</div> +<div class="line"><a name="l12146"></a><span class="lineno">12146</span>  </div> +<div class="line"><a name="l12147"></a><span class="lineno">12147</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l12148"></a><span class="lineno">12148</span> }</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> VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div> +<div class="line"><a name="l12151"></a><span class="lineno">12151</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12152"></a><span class="lineno">12152</span>  <span class="keywordflow">for</span>(uint32_t level = 0; level < m_LevelCount; ++level)</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>  <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</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="keywordflow">return</span> LevelToNodeSize(level);</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>  }</div> +<div class="line"><a name="l12159"></a><span class="lineno">12159</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l12160"></a><span class="lineno">12160</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> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)<span class="keyword"> const</span></div> +<div class="line"><a name="l12163"></a><span class="lineno">12163</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12164"></a><span class="lineno">12164</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</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>  outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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>  outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div> +<div class="line"><a name="l12169"></a><span class="lineno">12169</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div> +<div class="line"><a name="l12170"></a><span class="lineno">12170</span>  </div> +<div class="line"><a name="l12171"></a><span class="lineno">12171</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div> +<div class="line"><a name="l12172"></a><span class="lineno">12172</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l12173"></a><span class="lineno">12173</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div> +<div class="line"><a name="l12174"></a><span class="lineno">12174</span>  </div> +<div class="line"><a name="l12175"></a><span class="lineno">12175</span>  CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</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>  <span class="keywordflow">if</span>(unusableSize > 0)</div> +<div class="line"><a name="l12178"></a><span class="lineno">12178</span>  {</div> +<div class="line"><a name="l12179"></a><span class="lineno">12179</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l12180"></a><span class="lineno">12180</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div> +<div class="line"><a name="l12181"></a><span class="lineno">12181</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusableSize);</div> +<div class="line"><a name="l12182"></a><span class="lineno">12182</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusableSize);</div> +<div class="line"><a name="l12183"></a><span class="lineno">12183</span>  }</div> +<div class="line"><a name="l12184"></a><span class="lineno">12184</span> }</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="keywordtype">void</span> VmaBlockMetadata_Buddy::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>& inoutStats)<span class="keyword"> const</span></div> +<div class="line"><a name="l12187"></a><span class="lineno">12187</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12188"></a><span class="lineno">12188</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div> +<div class="line"><a name="l12189"></a><span class="lineno">12189</span>  </div> +<div class="line"><a name="l12190"></a><span class="lineno">12190</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div> +<div class="line"><a name="l12191"></a><span class="lineno">12191</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div> +<div class="line"><a name="l12192"></a><span class="lineno">12192</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div> +<div class="line"><a name="l12193"></a><span class="lineno">12193</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div> +<div class="line"><a name="l12194"></a><span class="lineno">12194</span>  inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div> +<div class="line"><a name="l12195"></a><span class="lineno">12195</span>  </div> +<div class="line"><a name="l12196"></a><span class="lineno">12196</span>  <span class="keywordflow">if</span>(unusableSize > 0)</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>  ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div> +<div class="line"><a name="l12199"></a><span class="lineno">12199</span>  <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</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> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</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>  VMA_ASSERT(m_FreeList[level].front != 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="comment">// It is at the front.</span></div> -<div class="line"><a name="l12208"></a><span class="lineno">12208</span>  <span class="keywordflow">if</span>(node->free.prev == VMA_NULL)</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>  VMA_ASSERT(m_FreeList[level].front == node);</div> -<div class="line"><a name="l12211"></a><span class="lineno">12211</span>  m_FreeList[level].front = node->free.next;</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">else</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>  Node* <span class="keyword">const</span> prevFreeNode = node->free.prev;</div> -<div class="line"><a name="l12216"></a><span class="lineno">12216</span>  VMA_ASSERT(prevFreeNode->free.next == node);</div> -<div class="line"><a name="l12217"></a><span class="lineno">12217</span>  prevFreeNode->free.next = node->free.next;</div> -<div class="line"><a name="l12218"></a><span class="lineno">12218</span>  }</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>  <span class="comment">// It is at the back.</span></div> -<div class="line"><a name="l12221"></a><span class="lineno">12221</span>  <span class="keywordflow">if</span>(node->free.next == VMA_NULL)</div> -<div class="line"><a name="l12222"></a><span class="lineno">12222</span>  {</div> -<div class="line"><a name="l12223"></a><span class="lineno">12223</span>  VMA_ASSERT(m_FreeList[level].back == node);</div> -<div class="line"><a name="l12224"></a><span class="lineno">12224</span>  m_FreeList[level].back = node->free.prev;</div> +<div class="line"><a name="l12203"></a><span class="lineno">12203</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</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="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter& json)<span class="keyword"> const</span></div> +<div class="line"><a name="l12206"></a><span class="lineno">12206</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12207"></a><span class="lineno">12207</span>  <span class="comment">// TODO optimize</span></div> +<div class="line"><a name="l12208"></a><span class="lineno">12208</span>  <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div> +<div class="line"><a name="l12209"></a><span class="lineno">12209</span>  CalcAllocationStatInfo(stat);</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>  PrintDetailedMap_Begin(</div> +<div class="line"><a name="l12212"></a><span class="lineno">12212</span>  json,</div> +<div class="line"><a name="l12213"></a><span class="lineno">12213</span>  stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div> +<div class="line"><a name="l12214"></a><span class="lineno">12214</span>  stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div> +<div class="line"><a name="l12215"></a><span class="lineno">12215</span>  stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div> +<div class="line"><a name="l12216"></a><span class="lineno">12216</span>  </div> +<div class="line"><a name="l12217"></a><span class="lineno">12217</span>  PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div> +<div class="line"><a name="l12218"></a><span class="lineno">12218</span>  </div> +<div class="line"><a name="l12219"></a><span class="lineno">12219</span>  <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div> +<div class="line"><a name="l12220"></a><span class="lineno">12220</span>  <span class="keywordflow">if</span>(unusableSize > 0)</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>  PrintDetailedMap_UnusedRange(json,</div> +<div class="line"><a name="l12223"></a><span class="lineno">12223</span>  m_UsableSize, <span class="comment">// offset</span></div> +<div class="line"><a name="l12224"></a><span class="lineno">12224</span>  unusableSize); <span class="comment">// size</span></div> <div class="line"><a name="l12225"></a><span class="lineno">12225</span>  }</div> -<div class="line"><a name="l12226"></a><span class="lineno">12226</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l12227"></a><span class="lineno">12227</span>  {</div> -<div class="line"><a name="l12228"></a><span class="lineno">12228</span>  Node* <span class="keyword">const</span> nextFreeNode = node->free.next;</div> -<div class="line"><a name="l12229"></a><span class="lineno">12229</span>  VMA_ASSERT(nextFreeNode->free.prev == node);</div> -<div class="line"><a name="l12230"></a><span class="lineno">12230</span>  nextFreeNode->free.prev = node->free.prev;</div> -<div class="line"><a name="l12231"></a><span class="lineno">12231</span>  }</div> -<div class="line"><a name="l12232"></a><span class="lineno">12232</span> }</div> -<div class="line"><a name="l12233"></a><span class="lineno">12233</span>  </div> -<div class="line"><a name="l12234"></a><span class="lineno">12234</span> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l12235"></a><span class="lineno">12235</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter& json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> -<div class="line"><a name="l12236"></a><span class="lineno">12236</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12237"></a><span class="lineno">12237</span>  <span class="keywordflow">switch</span>(node->type)</div> -<div class="line"><a name="l12238"></a><span class="lineno">12238</span>  {</div> -<div class="line"><a name="l12239"></a><span class="lineno">12239</span>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> -<div class="line"><a name="l12240"></a><span class="lineno">12240</span>  PrintDetailedMap_UnusedRange(json, node->offset, levelNodeSize);</div> -<div class="line"><a name="l12241"></a><span class="lineno">12241</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12242"></a><span class="lineno">12242</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div> -<div class="line"><a name="l12243"></a><span class="lineno">12243</span>  { </div> -<div class="line"><a name="l12244"></a><span class="lineno">12244</span>  PrintDetailedMap_Allocation(json, node->offset, node->allocation.alloc);</div> -<div class="line"><a name="l12245"></a><span class="lineno">12245</span>  <span class="keyword">const</span> VkDeviceSize allocSize = node->allocation.alloc->GetSize();</div> -<div class="line"><a name="l12246"></a><span class="lineno">12246</span>  <span class="keywordflow">if</span>(allocSize < levelNodeSize)</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>  PrintDetailedMap_UnusedRange(json, node->offset + allocSize, levelNodeSize - allocSize);</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>  }</div> -<div class="line"><a name="l12251"></a><span class="lineno">12251</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12252"></a><span class="lineno">12252</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div> -<div class="line"><a name="l12255"></a><span class="lineno">12255</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node->split.leftChild;</div> -<div class="line"><a name="l12256"></a><span class="lineno">12256</span>  PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div> -<div class="line"><a name="l12257"></a><span class="lineno">12257</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> -<div class="line"><a name="l12258"></a><span class="lineno">12258</span>  PrintDetailedMapNode(json, rightChild, childrenNodeSize);</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="keywordflow">break</span>;</div> -<div class="line"><a name="l12261"></a><span class="lineno">12261</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l12262"></a><span class="lineno">12262</span>  VMA_ASSERT(0);</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> }</div> -<div class="line"><a name="l12265"></a><span class="lineno">12265</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</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>  </div> -<div class="line"><a name="l12269"></a><span class="lineno">12269</span> <span class="comment">// class VmaDeviceMemoryBlock</span></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> VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> -<div class="line"><a name="l12272"></a><span class="lineno">12272</span>  m_pMetadata(VMA_NULL),</div> -<div class="line"><a name="l12273"></a><span class="lineno">12273</span>  m_MemoryTypeIndex(UINT32_MAX),</div> -<div class="line"><a name="l12274"></a><span class="lineno">12274</span>  m_Id(0),</div> -<div class="line"><a name="l12275"></a><span class="lineno">12275</span>  m_hMemory(VK_NULL_HANDLE),</div> -<div class="line"><a name="l12276"></a><span class="lineno">12276</span>  m_MapCount(0),</div> -<div class="line"><a name="l12277"></a><span class="lineno">12277</span>  m_pMappedData(VMA_NULL)</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> }</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>  PrintDetailedMap_End(json);</div> +<div class="line"><a name="l12228"></a><span class="lineno">12228</span> }</div> +<div class="line"><a name="l12229"></a><span class="lineno">12229</span>  </div> +<div class="line"><a name="l12230"></a><span class="lineno">12230</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l12231"></a><span class="lineno">12231</span>  </div> +<div class="line"><a name="l12232"></a><span class="lineno">12232</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div> +<div class="line"><a name="l12233"></a><span class="lineno">12233</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l12234"></a><span class="lineno">12234</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l12235"></a><span class="lineno">12235</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l12236"></a><span class="lineno">12236</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l12237"></a><span class="lineno">12237</span>  VkDeviceSize allocAlignment,</div> +<div class="line"><a name="l12238"></a><span class="lineno">12238</span>  <span class="keywordtype">bool</span> upperAddress,</div> +<div class="line"><a name="l12239"></a><span class="lineno">12239</span>  VmaSuballocationType allocType,</div> +<div class="line"><a name="l12240"></a><span class="lineno">12240</span>  <span class="keywordtype">bool</span> canMakeOtherLost,</div> +<div class="line"><a name="l12241"></a><span class="lineno">12241</span>  uint32_t strategy,</div> +<div class="line"><a name="l12242"></a><span class="lineno">12242</span>  VmaAllocationRequest* pAllocationRequest)</div> +<div class="line"><a name="l12243"></a><span class="lineno">12243</span> {</div> +<div class="line"><a name="l12244"></a><span class="lineno">12244</span>  VMA_ASSERT(!upperAddress && <span class="stringliteral">"VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm."</span>);</div> +<div class="line"><a name="l12245"></a><span class="lineno">12245</span>  </div> +<div class="line"><a name="l12246"></a><span class="lineno">12246</span>  <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div> +<div class="line"><a name="l12247"></a><span class="lineno">12247</span>  <span class="comment">// Whenever it might be an OPTIMAL image...</span></div> +<div class="line"><a name="l12248"></a><span class="lineno">12248</span>  <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div> +<div class="line"><a name="l12249"></a><span class="lineno">12249</span>  allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div> +<div class="line"><a name="l12250"></a><span class="lineno">12250</span>  allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</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>  allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div> +<div class="line"><a name="l12253"></a><span class="lineno">12253</span>  allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div> +<div class="line"><a name="l12254"></a><span class="lineno">12254</span>  }</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="keywordflow">if</span>(allocSize > m_UsableSize)</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">return</span> <span class="keyword">false</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>  </div> +<div class="line"><a name="l12261"></a><span class="lineno">12261</span>  <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div> +<div class="line"><a name="l12262"></a><span class="lineno">12262</span>  <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</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="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div> +<div class="line"><a name="l12265"></a><span class="lineno">12265</span>  freeNode != VMA_NULL;</div> +<div class="line"><a name="l12266"></a><span class="lineno">12266</span>  freeNode = freeNode->free.next)</div> +<div class="line"><a name="l12267"></a><span class="lineno">12267</span>  {</div> +<div class="line"><a name="l12268"></a><span class="lineno">12268</span>  <span class="keywordflow">if</span>(freeNode->offset % allocAlignment == 0)</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>  pAllocationRequest->type = VmaAllocationRequestType::Normal;</div> +<div class="line"><a name="l12271"></a><span class="lineno">12271</span>  pAllocationRequest->offset = freeNode->offset;</div> +<div class="line"><a name="l12272"></a><span class="lineno">12272</span>  pAllocationRequest->sumFreeSize = LevelToNodeSize(level);</div> +<div class="line"><a name="l12273"></a><span class="lineno">12273</span>  pAllocationRequest->sumItemSize = 0;</div> +<div class="line"><a name="l12274"></a><span class="lineno">12274</span>  pAllocationRequest->itemsToMakeLostCount = 0;</div> +<div class="line"><a name="l12275"></a><span class="lineno">12275</span>  pAllocationRequest->customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div> +<div class="line"><a name="l12276"></a><span class="lineno">12276</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l12277"></a><span class="lineno">12277</span>  }</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>  }</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">void</span> VmaDeviceMemoryBlock::Init(</div> -<div class="line"><a name="l12282"></a><span class="lineno">12282</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l12283"></a><span class="lineno">12283</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> -<div class="line"><a name="l12284"></a><span class="lineno">12284</span>  uint32_t newMemoryTypeIndex,</div> -<div class="line"><a name="l12285"></a><span class="lineno">12285</span>  VkDeviceMemory newMemory,</div> -<div class="line"><a name="l12286"></a><span class="lineno">12286</span>  VkDeviceSize newSize,</div> -<div class="line"><a name="l12287"></a><span class="lineno">12287</span>  uint32_t <span class="keywordtype">id</span>,</div> -<div class="line"><a name="l12288"></a><span class="lineno">12288</span>  uint32_t algorithm)</div> -<div class="line"><a name="l12289"></a><span class="lineno">12289</span> {</div> -<div class="line"><a name="l12290"></a><span class="lineno">12290</span>  VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div> -<div class="line"><a name="l12291"></a><span class="lineno">12291</span>  </div> -<div class="line"><a name="l12292"></a><span class="lineno">12292</span>  m_hParentPool = hParentPool;</div> -<div class="line"><a name="l12293"></a><span class="lineno">12293</span>  m_MemoryTypeIndex = newMemoryTypeIndex;</div> -<div class="line"><a name="l12294"></a><span class="lineno">12294</span>  m_Id = id;</div> -<div class="line"><a name="l12295"></a><span class="lineno">12295</span>  m_hMemory = newMemory;</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>  <span class="keywordflow">switch</span>(algorithm)</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>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div> -<div class="line"><a name="l12300"></a><span class="lineno">12300</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div> -<div class="line"><a name="l12301"></a><span class="lineno">12301</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12302"></a><span class="lineno">12302</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div> -<div class="line"><a name="l12303"></a><span class="lineno">12303</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div> -<div class="line"><a name="l12304"></a><span class="lineno">12304</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12305"></a><span class="lineno">12305</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l12306"></a><span class="lineno">12306</span>  VMA_ASSERT(0);</div> -<div class="line"><a name="l12307"></a><span class="lineno">12307</span>  <span class="comment">// Fall-through.</span></div> -<div class="line"><a name="l12308"></a><span class="lineno">12308</span>  <span class="keywordflow">case</span> 0:</div> -<div class="line"><a name="l12309"></a><span class="lineno">12309</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</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>  m_pMetadata->Init(newSize);</div> -<div class="line"><a name="l12312"></a><span class="lineno">12312</span> }</div> -<div class="line"><a name="l12313"></a><span class="lineno">12313</span>  </div> -<div class="line"><a name="l12314"></a><span class="lineno">12314</span> <span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div> -<div class="line"><a name="l12315"></a><span class="lineno">12315</span> {</div> -<div class="line"><a name="l12316"></a><span class="lineno">12316</span>  <span class="comment">// This is the most important assert in the entire library.</span></div> -<div class="line"><a name="l12317"></a><span class="lineno">12317</span>  <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div> -<div class="line"><a name="l12318"></a><span class="lineno">12318</span>  VMA_ASSERT(m_pMetadata->IsEmpty() && <span class="stringliteral">"Some allocations were not freed before destruction of this memory block!"</span>);</div> -<div class="line"><a name="l12319"></a><span class="lineno">12319</span>  </div> -<div class="line"><a name="l12320"></a><span class="lineno">12320</span>  VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div> -<div class="line"><a name="l12321"></a><span class="lineno">12321</span>  allocator->FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata->GetSize(), m_hMemory);</div> -<div class="line"><a name="l12322"></a><span class="lineno">12322</span>  m_hMemory = VK_NULL_HANDLE;</div> +<div class="line"><a name="l12281"></a><span class="lineno">12281</span>  <span class="keywordflow">return</span> <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>  </div> +<div class="line"><a name="l12284"></a><span class="lineno">12284</span> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div> +<div class="line"><a name="l12285"></a><span class="lineno">12285</span>  uint32_t currentFrameIndex,</div> +<div class="line"><a name="l12286"></a><span class="lineno">12286</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l12287"></a><span class="lineno">12287</span>  VmaAllocationRequest* pAllocationRequest)</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="comment">/*</span></div> +<div class="line"><a name="l12290"></a><span class="lineno">12290</span> <span class="comment"> Lost allocations are not supported in buddy allocator at the moment.</span></div> +<div class="line"><a name="l12291"></a><span class="lineno">12291</span> <span class="comment"> Support might be added in the future.</span></div> +<div class="line"><a name="l12292"></a><span class="lineno">12292</span> <span class="comment"> */</span></div> +<div class="line"><a name="l12293"></a><span class="lineno">12293</span>  <span class="keywordflow">return</span> pAllocationRequest->itemsToMakeLostCount == 0;</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>  </div> +<div class="line"><a name="l12296"></a><span class="lineno">12296</span> uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div> +<div class="line"><a name="l12297"></a><span class="lineno">12297</span> {</div> +<div class="line"><a name="l12298"></a><span class="lineno">12298</span>  <span class="comment">/*</span></div> +<div class="line"><a name="l12299"></a><span class="lineno">12299</span> <span class="comment"> Lost allocations are not supported in buddy allocator at the moment.</span></div> +<div class="line"><a name="l12300"></a><span class="lineno">12300</span> <span class="comment"> Support might be added in the future.</span></div> +<div class="line"><a name="l12301"></a><span class="lineno">12301</span> <span class="comment"> */</span></div> +<div class="line"><a name="l12302"></a><span class="lineno">12302</span>  <span class="keywordflow">return</span> 0;</div> +<div class="line"><a name="l12303"></a><span class="lineno">12303</span> }</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="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div> +<div class="line"><a name="l12306"></a><span class="lineno">12306</span>  <span class="keyword">const</span> VmaAllocationRequest& request,</div> +<div class="line"><a name="l12307"></a><span class="lineno">12307</span>  VmaSuballocationType type,</div> +<div class="line"><a name="l12308"></a><span class="lineno">12308</span>  VkDeviceSize allocSize,</div> +<div class="line"><a name="l12309"></a><span class="lineno">12309</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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>  VMA_ASSERT(request.type == VmaAllocationRequestType::Normal);</div> +<div class="line"><a name="l12312"></a><span class="lineno">12312</span>  </div> +<div class="line"><a name="l12313"></a><span class="lineno">12313</span>  <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div> +<div class="line"><a name="l12314"></a><span class="lineno">12314</span>  uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</div> +<div class="line"><a name="l12315"></a><span class="lineno">12315</span>  </div> +<div class="line"><a name="l12316"></a><span class="lineno">12316</span>  Node* currNode = m_FreeList[currLevel].front;</div> +<div class="line"><a name="l12317"></a><span class="lineno">12317</span>  VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);</div> +<div class="line"><a name="l12318"></a><span class="lineno">12318</span>  <span class="keywordflow">while</span>(currNode->offset != request.offset)</div> +<div class="line"><a name="l12319"></a><span class="lineno">12319</span>  {</div> +<div class="line"><a name="l12320"></a><span class="lineno">12320</span>  currNode = currNode->free.next;</div> +<div class="line"><a name="l12321"></a><span class="lineno">12321</span>  VMA_ASSERT(currNode != VMA_NULL && currNode->type == Node::TYPE_FREE);</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>  </div> -<div class="line"><a name="l12324"></a><span class="lineno">12324</span>  vma_delete(allocator, m_pMetadata);</div> -<div class="line"><a name="l12325"></a><span class="lineno">12325</span>  m_pMetadata = VMA_NULL;</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> <span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div> -<div class="line"><a name="l12329"></a><span class="lineno">12329</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12330"></a><span class="lineno">12330</span>  VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &&</div> -<div class="line"><a name="l12331"></a><span class="lineno">12331</span>  (m_pMetadata->GetSize() != 0));</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="keywordflow">return</span> m_pMetadata->Validate();</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>  </div> -<div class="line"><a name="l12336"></a><span class="lineno">12336</span> VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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>  <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div> -<div class="line"><a name="l12339"></a><span class="lineno">12339</span>  VkResult res = Map(hAllocator, 1, &pData);</div> -<div class="line"><a name="l12340"></a><span class="lineno">12340</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</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>  <span class="keywordflow">return</span> res;</div> -<div class="line"><a name="l12343"></a><span class="lineno">12343</span>  }</div> -<div class="line"><a name="l12344"></a><span class="lineno">12344</span>  </div> -<div class="line"><a name="l12345"></a><span class="lineno">12345</span>  res = m_pMetadata->CheckCorruption(pData);</div> +<div class="line"><a name="l12324"></a><span class="lineno">12324</span>  <span class="comment">// Go down, splitting free nodes.</span></div> +<div class="line"><a name="l12325"></a><span class="lineno">12325</span>  <span class="keywordflow">while</span>(currLevel < targetLevel)</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>  <span class="comment">// currNode is already first free node at currLevel.</span></div> +<div class="line"><a name="l12328"></a><span class="lineno">12328</span>  <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div> +<div class="line"><a name="l12329"></a><span class="lineno">12329</span>  RemoveFromFreeList(currLevel, currNode);</div> +<div class="line"><a name="l12330"></a><span class="lineno">12330</span>  </div> +<div class="line"><a name="l12331"></a><span class="lineno">12331</span>  <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</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">// Create two free sub-nodes.</span></div> +<div class="line"><a name="l12334"></a><span class="lineno">12334</span>  Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div> +<div class="line"><a name="l12335"></a><span class="lineno">12335</span>  Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</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>  leftChild->offset = currNode->offset;</div> +<div class="line"><a name="l12338"></a><span class="lineno">12338</span>  leftChild->type = Node::TYPE_FREE;</div> +<div class="line"><a name="l12339"></a><span class="lineno">12339</span>  leftChild->parent = currNode;</div> +<div class="line"><a name="l12340"></a><span class="lineno">12340</span>  leftChild->buddy = rightChild;</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>  rightChild->offset = currNode->offset + LevelToNodeSize(childrenLevel);</div> +<div class="line"><a name="l12343"></a><span class="lineno">12343</span>  rightChild->type = Node::TYPE_FREE;</div> +<div class="line"><a name="l12344"></a><span class="lineno">12344</span>  rightChild->parent = currNode;</div> +<div class="line"><a name="l12345"></a><span class="lineno">12345</span>  rightChild->buddy = leftChild;</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>  Unmap(hAllocator, 1);</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>  <span class="keywordflow">return</span> res;</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>  </div> -<div class="line"><a name="l12352"></a><span class="lineno">12352</span> VkResult VmaDeviceMemoryBlock::Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div> -<div class="line"><a name="l12353"></a><span class="lineno">12353</span> {</div> -<div class="line"><a name="l12354"></a><span class="lineno">12354</span>  <span class="keywordflow">if</span>(count == 0)</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>  <span class="keywordflow">return</span> VK_SUCCESS;</div> -<div class="line"><a name="l12357"></a><span class="lineno">12357</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>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12360"></a><span class="lineno">12360</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</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>  m_MapCount += count;</div> -<div class="line"><a name="l12363"></a><span class="lineno">12363</span>  VMA_ASSERT(m_pMappedData != VMA_NULL);</div> -<div class="line"><a name="l12364"></a><span class="lineno">12364</span>  <span class="keywordflow">if</span>(ppData != VMA_NULL)</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>  *ppData = m_pMappedData;</div> -<div class="line"><a name="l12367"></a><span class="lineno">12367</span>  }</div> -<div class="line"><a name="l12368"></a><span class="lineno">12368</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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="keywordflow">else</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>  VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(</div> -<div class="line"><a name="l12373"></a><span class="lineno">12373</span>  hAllocator->m_hDevice,</div> -<div class="line"><a name="l12374"></a><span class="lineno">12374</span>  m_hMemory,</div> -<div class="line"><a name="l12375"></a><span class="lineno">12375</span>  0, <span class="comment">// offset</span></div> -<div class="line"><a name="l12376"></a><span class="lineno">12376</span>  VK_WHOLE_SIZE,</div> -<div class="line"><a name="l12377"></a><span class="lineno">12377</span>  0, <span class="comment">// flags</span></div> -<div class="line"><a name="l12378"></a><span class="lineno">12378</span>  &m_pMappedData);</div> -<div class="line"><a name="l12379"></a><span class="lineno">12379</span>  <span class="keywordflow">if</span>(result == VK_SUCCESS)</div> -<div class="line"><a name="l12380"></a><span class="lineno">12380</span>  {</div> -<div class="line"><a name="l12381"></a><span class="lineno">12381</span>  <span class="keywordflow">if</span>(ppData != VMA_NULL)</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>  *ppData = m_pMappedData;</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>  m_MapCount = count;</div> -<div class="line"><a name="l12386"></a><span class="lineno">12386</span>  }</div> -<div class="line"><a name="l12387"></a><span class="lineno">12387</span>  <span class="keywordflow">return</span> result;</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> <span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div> -<div class="line"><a name="l12392"></a><span class="lineno">12392</span> {</div> -<div class="line"><a name="l12393"></a><span class="lineno">12393</span>  <span class="keywordflow">if</span>(count == 0)</div> -<div class="line"><a name="l12394"></a><span class="lineno">12394</span>  {</div> -<div class="line"><a name="l12395"></a><span class="lineno">12395</span>  <span class="keywordflow">return</span>;</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>  </div> -<div class="line"><a name="l12398"></a><span class="lineno">12398</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12399"></a><span class="lineno">12399</span>  <span class="keywordflow">if</span>(m_MapCount >= count)</div> -<div class="line"><a name="l12400"></a><span class="lineno">12400</span>  {</div> -<div class="line"><a name="l12401"></a><span class="lineno">12401</span>  m_MapCount -= count;</div> -<div class="line"><a name="l12402"></a><span class="lineno">12402</span>  <span class="keywordflow">if</span>(m_MapCount == 0)</div> -<div class="line"><a name="l12403"></a><span class="lineno">12403</span>  {</div> -<div class="line"><a name="l12404"></a><span class="lineno">12404</span>  m_pMappedData = VMA_NULL;</div> -<div class="line"><a name="l12405"></a><span class="lineno">12405</span>  (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, m_hMemory);</div> -<div class="line"><a name="l12406"></a><span class="lineno">12406</span>  }</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>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l12409"></a><span class="lineno">12409</span>  {</div> -<div class="line"><a name="l12410"></a><span class="lineno">12410</span>  VMA_ASSERT(0 && <span class="stringliteral">"VkDeviceMemory block is being unmapped while it was not previously mapped."</span>);</div> -<div class="line"><a name="l12411"></a><span class="lineno">12411</span>  }</div> -<div class="line"><a name="l12412"></a><span class="lineno">12412</span> }</div> -<div class="line"><a name="l12413"></a><span class="lineno">12413</span>  </div> -<div class="line"><a name="l12414"></a><span class="lineno">12414</span> VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div> -<div class="line"><a name="l12415"></a><span class="lineno">12415</span> {</div> -<div class="line"><a name="l12416"></a><span class="lineno">12416</span>  VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);</div> -<div class="line"><a name="l12417"></a><span class="lineno">12417</span>  VMA_ASSERT(allocOffset >= VMA_DEBUG_MARGIN);</div> -<div class="line"><a name="l12418"></a><span class="lineno">12418</span>  </div> -<div class="line"><a name="l12419"></a><span class="lineno">12419</span>  <span class="keywordtype">void</span>* pData;</div> -<div class="line"><a name="l12420"></a><span class="lineno">12420</span>  VkResult res = Map(hAllocator, 1, &pData);</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>  VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div> -<div class="line"><a name="l12427"></a><span class="lineno">12427</span>  VmaWriteMagicValue(pData, allocOffset + allocSize);</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>  Unmap(hAllocator, 1);</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>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  </div> -<div class="line"><a name="l12434"></a><span class="lineno">12434</span> VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div> -<div class="line"><a name="l12435"></a><span class="lineno">12435</span> {</div> -<div class="line"><a name="l12436"></a><span class="lineno">12436</span>  VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);</div> -<div class="line"><a name="l12437"></a><span class="lineno">12437</span>  VMA_ASSERT(allocOffset >= VMA_DEBUG_MARGIN);</div> -<div class="line"><a name="l12438"></a><span class="lineno">12438</span>  </div> -<div class="line"><a name="l12439"></a><span class="lineno">12439</span>  <span class="keywordtype">void</span>* pData;</div> -<div class="line"><a name="l12440"></a><span class="lineno">12440</span>  VkResult res = Map(hAllocator, 1, &pData);</div> -<div class="line"><a name="l12441"></a><span class="lineno">12441</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div> -<div class="line"><a name="l12442"></a><span class="lineno">12442</span>  {</div> -<div class="line"><a name="l12443"></a><span class="lineno">12443</span>  <span class="keywordflow">return</span> res;</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>  </div> -<div class="line"><a name="l12446"></a><span class="lineno">12446</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div> -<div class="line"><a name="l12447"></a><span class="lineno">12447</span>  {</div> -<div class="line"><a name="l12448"></a><span class="lineno">12448</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!"</span>);</div> -<div class="line"><a name="l12449"></a><span class="lineno">12449</span>  }</div> -<div class="line"><a name="l12450"></a><span class="lineno">12450</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</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>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!"</span>);</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>  </div> -<div class="line"><a name="l12455"></a><span class="lineno">12455</span>  Unmap(hAllocator, 1);</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>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  </div> -<div class="line"><a name="l12460"></a><span class="lineno">12460</span> VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div> -<div class="line"><a name="l12461"></a><span class="lineno">12461</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l12462"></a><span class="lineno">12462</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l12463"></a><span class="lineno">12463</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l12464"></a><span class="lineno">12464</span>  VkBuffer hBuffer,</div> -<div class="line"><a name="l12465"></a><span class="lineno">12465</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div> -<div class="line"><a name="l12466"></a><span class="lineno">12466</span> {</div> -<div class="line"><a name="l12467"></a><span class="lineno">12467</span>  VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&</div> -<div class="line"><a name="l12468"></a><span class="lineno">12468</span>  hAllocation->GetBlock() == <span class="keyword">this</span>);</div> -<div class="line"><a name="l12469"></a><span class="lineno">12469</span>  VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&</div> -<div class="line"><a name="l12470"></a><span class="lineno">12470</span>  <span class="stringliteral">"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?"</span>);</div> -<div class="line"><a name="l12471"></a><span class="lineno">12471</span>  <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;</div> -<div class="line"><a name="l12472"></a><span class="lineno">12472</span>  <span class="comment">// This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div> -<div class="line"><a name="l12473"></a><span class="lineno">12473</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12474"></a><span class="lineno">12474</span>  <span class="keywordflow">return</span> hAllocator->BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</div> -<div class="line"><a name="l12475"></a><span class="lineno">12475</span> }</div> +<div class="line"><a name="l12347"></a><span class="lineno">12347</span>  <span class="comment">// Convert current currNode to split type.</span></div> +<div class="line"><a name="l12348"></a><span class="lineno">12348</span>  currNode->type = Node::TYPE_SPLIT;</div> +<div class="line"><a name="l12349"></a><span class="lineno">12349</span>  currNode->split.leftChild = leftChild;</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="comment">// Add child nodes to free list. Order is important!</span></div> +<div class="line"><a name="l12352"></a><span class="lineno">12352</span>  AddToFreeListFront(childrenLevel, rightChild);</div> +<div class="line"><a name="l12353"></a><span class="lineno">12353</span>  AddToFreeListFront(childrenLevel, leftChild);</div> +<div class="line"><a name="l12354"></a><span class="lineno">12354</span>  </div> +<div class="line"><a name="l12355"></a><span class="lineno">12355</span>  ++m_FreeCount;</div> +<div class="line"><a name="l12356"></a><span class="lineno">12356</span>  <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div> +<div class="line"><a name="l12357"></a><span class="lineno">12357</span>  ++currLevel;</div> +<div class="line"><a name="l12358"></a><span class="lineno">12358</span>  currNode = m_FreeList[currLevel].front;</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="comment">/*</span></div> +<div class="line"><a name="l12361"></a><span class="lineno">12361</span> <span class="comment"> We can be sure that currNode, as left child of node previously split,</span></div> +<div class="line"><a name="l12362"></a><span class="lineno">12362</span> <span class="comment"> also fullfills the alignment requirement.</span></div> +<div class="line"><a name="l12363"></a><span class="lineno">12363</span> <span class="comment"> */</span></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>  </div> +<div class="line"><a name="l12366"></a><span class="lineno">12366</span>  <span class="comment">// Remove from free list.</span></div> +<div class="line"><a name="l12367"></a><span class="lineno">12367</span>  VMA_ASSERT(currLevel == targetLevel &&</div> +<div class="line"><a name="l12368"></a><span class="lineno">12368</span>  currNode != VMA_NULL &&</div> +<div class="line"><a name="l12369"></a><span class="lineno">12369</span>  currNode->type == Node::TYPE_FREE);</div> +<div class="line"><a name="l12370"></a><span class="lineno">12370</span>  RemoveFromFreeList(currLevel, currNode);</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="comment">// Convert to allocation node.</span></div> +<div class="line"><a name="l12373"></a><span class="lineno">12373</span>  currNode->type = Node::TYPE_ALLOCATION;</div> +<div class="line"><a name="l12374"></a><span class="lineno">12374</span>  currNode->allocation.alloc = hAllocation;</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>  ++m_AllocationCount;</div> +<div class="line"><a name="l12377"></a><span class="lineno">12377</span>  --m_FreeCount;</div> +<div class="line"><a name="l12378"></a><span class="lineno">12378</span>  m_SumFreeSize -= allocSize;</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>  </div> +<div class="line"><a name="l12381"></a><span class="lineno">12381</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</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>(node->type == Node::TYPE_SPLIT)</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>  DeleteNode(node->split.leftChild->buddy);</div> +<div class="line"><a name="l12386"></a><span class="lineno">12386</span>  DeleteNode(node->split.leftChild);</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>  vma_delete(GetAllocationCallbacks(), node);</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> <span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext& ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l12393"></a><span class="lineno">12393</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12394"></a><span class="lineno">12394</span>  VMA_VALIDATE(level < m_LevelCount);</div> +<div class="line"><a name="l12395"></a><span class="lineno">12395</span>  VMA_VALIDATE(curr->parent == parent);</div> +<div class="line"><a name="l12396"></a><span class="lineno">12396</span>  VMA_VALIDATE((curr->buddy == VMA_NULL) == (parent == VMA_NULL));</div> +<div class="line"><a name="l12397"></a><span class="lineno">12397</span>  VMA_VALIDATE(curr->buddy == VMA_NULL || curr->buddy->buddy == curr);</div> +<div class="line"><a name="l12398"></a><span class="lineno">12398</span>  <span class="keywordflow">switch</span>(curr->type)</div> +<div class="line"><a name="l12399"></a><span class="lineno">12399</span>  {</div> +<div class="line"><a name="l12400"></a><span class="lineno">12400</span>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> +<div class="line"><a name="l12401"></a><span class="lineno">12401</span>  <span class="comment">// curr->free.prev, next are validated separately.</span></div> +<div class="line"><a name="l12402"></a><span class="lineno">12402</span>  ctx.calculatedSumFreeSize += levelNodeSize;</div> +<div class="line"><a name="l12403"></a><span class="lineno">12403</span>  ++ctx.calculatedFreeCount;</div> +<div class="line"><a name="l12404"></a><span class="lineno">12404</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12405"></a><span class="lineno">12405</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div> +<div class="line"><a name="l12406"></a><span class="lineno">12406</span>  ++ctx.calculatedAllocationCount;</div> +<div class="line"><a name="l12407"></a><span class="lineno">12407</span>  ctx.calculatedSumFreeSize += levelNodeSize - curr->allocation.alloc->GetSize();</div> +<div class="line"><a name="l12408"></a><span class="lineno">12408</span>  VMA_VALIDATE(curr->allocation.alloc != VK_NULL_HANDLE);</div> +<div class="line"><a name="l12409"></a><span class="lineno">12409</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12410"></a><span class="lineno">12410</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div> +<div class="line"><a name="l12411"></a><span class="lineno">12411</span>  {</div> +<div class="line"><a name="l12412"></a><span class="lineno">12412</span>  <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div> +<div class="line"><a name="l12413"></a><span class="lineno">12413</span>  <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div> +<div class="line"><a name="l12414"></a><span class="lineno">12414</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr->split.leftChild;</div> +<div class="line"><a name="l12415"></a><span class="lineno">12415</span>  VMA_VALIDATE(leftChild != VMA_NULL);</div> +<div class="line"><a name="l12416"></a><span class="lineno">12416</span>  VMA_VALIDATE(leftChild->offset == curr->offset);</div> +<div class="line"><a name="l12417"></a><span class="lineno">12417</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div> +<div class="line"><a name="l12418"></a><span class="lineno">12418</span>  {</div> +<div class="line"><a name="l12419"></a><span class="lineno">12419</span>  VMA_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode for left child failed."</span>);</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="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> +<div class="line"><a name="l12422"></a><span class="lineno">12422</span>  VMA_VALIDATE(rightChild->offset == curr->offset + childrenLevelNodeSize);</div> +<div class="line"><a name="l12423"></a><span class="lineno">12423</span>  <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</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>  VMA_VALIDATE(<span class="keyword">false</span> && <span class="stringliteral">"ValidateNode for right child failed."</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>  }</div> +<div class="line"><a name="l12428"></a><span class="lineno">12428</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12429"></a><span class="lineno">12429</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l12430"></a><span class="lineno">12430</span>  <span class="keywordflow">return</span> <span class="keyword">false</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>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l12434"></a><span class="lineno">12434</span> }</div> +<div class="line"><a name="l12435"></a><span class="lineno">12435</span>  </div> +<div class="line"><a name="l12436"></a><span class="lineno">12436</span> uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l12437"></a><span class="lineno">12437</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12438"></a><span class="lineno">12438</span>  <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div> +<div class="line"><a name="l12439"></a><span class="lineno">12439</span>  uint32_t level = 0;</div> +<div class="line"><a name="l12440"></a><span class="lineno">12440</span>  VkDeviceSize currLevelNodeSize = m_UsableSize;</div> +<div class="line"><a name="l12441"></a><span class="lineno">12441</span>  VkDeviceSize nextLevelNodeSize = currLevelNodeSize >> 1;</div> +<div class="line"><a name="l12442"></a><span class="lineno">12442</span>  <span class="keywordflow">while</span>(allocSize <= nextLevelNodeSize && level + 1 < m_LevelCount)</div> +<div class="line"><a name="l12443"></a><span class="lineno">12443</span>  {</div> +<div class="line"><a name="l12444"></a><span class="lineno">12444</span>  ++level;</div> +<div class="line"><a name="l12445"></a><span class="lineno">12445</span>  currLevelNodeSize = nextLevelNodeSize;</div> +<div class="line"><a name="l12446"></a><span class="lineno">12446</span>  nextLevelNodeSize = currLevelNodeSize >> 1;</div> +<div class="line"><a name="l12447"></a><span class="lineno">12447</span>  }</div> +<div class="line"><a name="l12448"></a><span class="lineno">12448</span>  <span class="keywordflow">return</span> level;</div> +<div class="line"><a name="l12449"></a><span class="lineno">12449</span> }</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> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div> +<div class="line"><a name="l12452"></a><span class="lineno">12452</span> {</div> +<div class="line"><a name="l12453"></a><span class="lineno">12453</span>  <span class="comment">// Find node and level.</span></div> +<div class="line"><a name="l12454"></a><span class="lineno">12454</span>  Node* node = m_Root;</div> +<div class="line"><a name="l12455"></a><span class="lineno">12455</span>  VkDeviceSize nodeOffset = 0;</div> +<div class="line"><a name="l12456"></a><span class="lineno">12456</span>  uint32_t level = 0;</div> +<div class="line"><a name="l12457"></a><span class="lineno">12457</span>  VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div> +<div class="line"><a name="l12458"></a><span class="lineno">12458</span>  <span class="keywordflow">while</span>(node->type == Node::TYPE_SPLIT)</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="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize >> 1;</div> +<div class="line"><a name="l12461"></a><span class="lineno">12461</span>  <span class="keywordflow">if</span>(offset < nodeOffset + nextLevelSize)</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>  node = node->split.leftChild;</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>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l12466"></a><span class="lineno">12466</span>  {</div> +<div class="line"><a name="l12467"></a><span class="lineno">12467</span>  node = node->split.leftChild->buddy;</div> +<div class="line"><a name="l12468"></a><span class="lineno">12468</span>  nodeOffset += nextLevelSize;</div> +<div class="line"><a name="l12469"></a><span class="lineno">12469</span>  }</div> +<div class="line"><a name="l12470"></a><span class="lineno">12470</span>  ++level;</div> +<div class="line"><a name="l12471"></a><span class="lineno">12471</span>  levelNodeSize = nextLevelSize;</div> +<div class="line"><a name="l12472"></a><span class="lineno">12472</span>  }</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>  VMA_ASSERT(node != VMA_NULL && node->type == Node::TYPE_ALLOCATION);</div> +<div class="line"><a name="l12475"></a><span class="lineno">12475</span>  VMA_ASSERT(alloc == VK_NULL_HANDLE || node->allocation.alloc == alloc);</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> VkResult VmaDeviceMemoryBlock::BindImageMemory(</div> -<div class="line"><a name="l12478"></a><span class="lineno">12478</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l12479"></a><span class="lineno">12479</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> -<div class="line"><a name="l12480"></a><span class="lineno">12480</span>  VkDeviceSize allocationLocalOffset,</div> -<div class="line"><a name="l12481"></a><span class="lineno">12481</span>  VkImage hImage,</div> -<div class="line"><a name="l12482"></a><span class="lineno">12482</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</div> -<div class="line"><a name="l12483"></a><span class="lineno">12483</span> {</div> -<div class="line"><a name="l12484"></a><span class="lineno">12484</span>  VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&</div> -<div class="line"><a name="l12485"></a><span class="lineno">12485</span>  hAllocation->GetBlock() == <span class="keyword">this</span>);</div> -<div class="line"><a name="l12486"></a><span class="lineno">12486</span>  VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&</div> -<div class="line"><a name="l12487"></a><span class="lineno">12487</span>  <span class="stringliteral">"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?"</span>);</div> -<div class="line"><a name="l12488"></a><span class="lineno">12488</span>  <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;</div> -<div class="line"><a name="l12489"></a><span class="lineno">12489</span>  <span class="comment">// This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div> -<div class="line"><a name="l12490"></a><span class="lineno">12490</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12491"></a><span class="lineno">12491</span>  <span class="keywordflow">return</span> hAllocator->BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</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="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)</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>  memset(&outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div> -<div class="line"><a name="l12497"></a><span class="lineno">12497</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> -<div class="line"><a name="l12498"></a><span class="lineno">12498</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</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>  </div> -<div class="line"><a name="l12501"></a><span class="lineno">12501</span> <span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div> -<div class="line"><a name="l12502"></a><span class="lineno">12502</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& srcInfo)</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>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div> -<div class="line"><a name="l12505"></a><span class="lineno">12505</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> -<div class="line"><a name="l12506"></a><span class="lineno">12506</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> -<div class="line"><a name="l12507"></a><span class="lineno">12507</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> -<div class="line"><a name="l12508"></a><span class="lineno">12508</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> -<div class="line"><a name="l12509"></a><span class="lineno">12509</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div> -<div class="line"><a name="l12510"></a><span class="lineno">12510</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div> -<div class="line"><a name="l12511"></a><span class="lineno">12511</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div> -<div class="line"><a name="l12512"></a><span class="lineno">12512</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div> -<div class="line"><a name="l12513"></a><span class="lineno">12513</span> }</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> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& inoutInfo)</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>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> > 0) ?</div> -<div class="line"><a name="l12518"></a><span class="lineno">12518</span>  VmaRoundDiv<VkDeviceSize>(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div> -<div class="line"><a name="l12519"></a><span class="lineno">12519</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> > 0) ?</div> -<div class="line"><a name="l12520"></a><span class="lineno">12520</span>  VmaRoundDiv<VkDeviceSize>(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div> -<div class="line"><a name="l12521"></a><span class="lineno">12521</span> }</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> VmaPool_T::VmaPool_T(</div> -<div class="line"><a name="l12524"></a><span class="lineno">12524</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l12525"></a><span class="lineno">12525</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> -<div class="line"><a name="l12526"></a><span class="lineno">12526</span>  VkDeviceSize preferredBlockSize) :</div> -<div class="line"><a name="l12527"></a><span class="lineno">12527</span>  m_BlockVector(</div> -<div class="line"><a name="l12528"></a><span class="lineno">12528</span>  hAllocator,</div> -<div class="line"><a name="l12529"></a><span class="lineno">12529</span>  this, <span class="comment">// hParentPool</span></div> -<div class="line"><a name="l12530"></a><span class="lineno">12530</span>  createInfo.memoryTypeIndex,</div> -<div class="line"><a name="l12531"></a><span class="lineno">12531</span>  createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div> -<div class="line"><a name="l12532"></a><span class="lineno">12532</span>  createInfo.minBlockCount,</div> -<div class="line"><a name="l12533"></a><span class="lineno">12533</span>  createInfo.maxBlockCount,</div> -<div class="line"><a name="l12534"></a><span class="lineno">12534</span>  (createInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator->GetBufferImageGranularity(),</div> -<div class="line"><a name="l12535"></a><span class="lineno">12535</span>  createInfo.frameInUseCount,</div> -<div class="line"><a name="l12536"></a><span class="lineno">12536</span>  createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div> -<div class="line"><a name="l12537"></a><span class="lineno">12537</span>  createInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>), <span class="comment">// algorithm</span></div> -<div class="line"><a name="l12538"></a><span class="lineno">12538</span>  m_Id(0),</div> -<div class="line"><a name="l12539"></a><span class="lineno">12539</span>  m_Name(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> }</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> VmaPool_T::~VmaPool_T()</div> -<div class="line"><a name="l12544"></a><span class="lineno">12544</span> {</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> <span class="keywordtype">void</span> VmaPool_T::SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</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>  <span class="keyword">const</span> VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()->GetAllocationCallbacks();</div> -<div class="line"><a name="l12550"></a><span class="lineno">12550</span>  VmaFreeString(allocs, m_Name);</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="keywordflow">if</span>(pName != VMA_NULL)</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>  m_Name = VmaCreateStringCopy(allocs, pName);</div> +<div class="line"><a name="l12477"></a><span class="lineno">12477</span>  ++m_FreeCount;</div> +<div class="line"><a name="l12478"></a><span class="lineno">12478</span>  --m_AllocationCount;</div> +<div class="line"><a name="l12479"></a><span class="lineno">12479</span>  m_SumFreeSize += alloc->GetSize();</div> +<div class="line"><a name="l12480"></a><span class="lineno">12480</span>  </div> +<div class="line"><a name="l12481"></a><span class="lineno">12481</span>  node->type = Node::TYPE_FREE;</div> +<div class="line"><a name="l12482"></a><span class="lineno">12482</span>  </div> +<div class="line"><a name="l12483"></a><span class="lineno">12483</span>  <span class="comment">// Join free nodes if possible.</span></div> +<div class="line"><a name="l12484"></a><span class="lineno">12484</span>  <span class="keywordflow">while</span>(level > 0 && node->buddy->type == Node::TYPE_FREE)</div> +<div class="line"><a name="l12485"></a><span class="lineno">12485</span>  {</div> +<div class="line"><a name="l12486"></a><span class="lineno">12486</span>  RemoveFromFreeList(level, node->buddy);</div> +<div class="line"><a name="l12487"></a><span class="lineno">12487</span>  Node* <span class="keyword">const</span> parent = node->parent;</div> +<div class="line"><a name="l12488"></a><span class="lineno">12488</span>  </div> +<div class="line"><a name="l12489"></a><span class="lineno">12489</span>  vma_delete(GetAllocationCallbacks(), node->buddy);</div> +<div class="line"><a name="l12490"></a><span class="lineno">12490</span>  vma_delete(GetAllocationCallbacks(), node);</div> +<div class="line"><a name="l12491"></a><span class="lineno">12491</span>  parent->type = Node::TYPE_FREE;</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>  node = parent;</div> +<div class="line"><a name="l12494"></a><span class="lineno">12494</span>  --level;</div> +<div class="line"><a name="l12495"></a><span class="lineno">12495</span>  <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div> +<div class="line"><a name="l12496"></a><span class="lineno">12496</span>  --m_FreeCount;</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>  </div> +<div class="line"><a name="l12499"></a><span class="lineno">12499</span>  AddToFreeListFront(level, node);</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>  </div> +<div class="line"><a name="l12502"></a><span class="lineno">12502</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l12503"></a><span class="lineno">12503</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12504"></a><span class="lineno">12504</span>  <span class="keywordflow">switch</span>(node->type)</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>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> +<div class="line"><a name="l12507"></a><span class="lineno">12507</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l12508"></a><span class="lineno">12508</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div> +<div class="line"><a name="l12509"></a><span class="lineno">12509</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, levelNodeSize);</div> +<div class="line"><a name="l12510"></a><span class="lineno">12510</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div> +<div class="line"><a name="l12511"></a><span class="lineno">12511</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12512"></a><span class="lineno">12512</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div> +<div class="line"><a name="l12513"></a><span class="lineno">12513</span>  {</div> +<div class="line"><a name="l12514"></a><span class="lineno">12514</span>  <span class="keyword">const</span> VkDeviceSize allocSize = node->allocation.alloc->GetSize();</div> +<div class="line"><a name="l12515"></a><span class="lineno">12515</span>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> +<div class="line"><a name="l12516"></a><span class="lineno">12516</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div> +<div class="line"><a name="l12517"></a><span class="lineno">12517</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, allocSize);</div> +<div class="line"><a name="l12518"></a><span class="lineno">12518</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div> +<div class="line"><a name="l12519"></a><span class="lineno">12519</span>  </div> +<div class="line"><a name="l12520"></a><span class="lineno">12520</span>  <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div> +<div class="line"><a name="l12521"></a><span class="lineno">12521</span>  <span class="keywordflow">if</span>(unusedRangeSize > 0)</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>  ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l12524"></a><span class="lineno">12524</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div> +<div class="line"><a name="l12525"></a><span class="lineno">12525</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div> +<div class="line"><a name="l12526"></a><span class="lineno">12526</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div> +<div class="line"><a name="l12527"></a><span class="lineno">12527</span>  }</div> +<div class="line"><a name="l12528"></a><span class="lineno">12528</span>  }</div> +<div class="line"><a name="l12529"></a><span class="lineno">12529</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12530"></a><span class="lineno">12530</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div> +<div class="line"><a name="l12531"></a><span class="lineno">12531</span>  {</div> +<div class="line"><a name="l12532"></a><span class="lineno">12532</span>  <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div> +<div class="line"><a name="l12533"></a><span class="lineno">12533</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node->split.leftChild;</div> +<div class="line"><a name="l12534"></a><span class="lineno">12534</span>  CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div> +<div class="line"><a name="l12535"></a><span class="lineno">12535</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> +<div class="line"><a name="l12536"></a><span class="lineno">12536</span>  CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</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>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12539"></a><span class="lineno">12539</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l12540"></a><span class="lineno">12540</span>  VMA_ASSERT(0);</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="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</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>  VMA_ASSERT(node->type == Node::TYPE_FREE);</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>  <span class="comment">// List is empty.</span></div> +<div class="line"><a name="l12549"></a><span class="lineno">12549</span>  Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div> +<div class="line"><a name="l12550"></a><span class="lineno">12550</span>  <span class="keywordflow">if</span>(frontNode == VMA_NULL)</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>  VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div> +<div class="line"><a name="l12553"></a><span class="lineno">12553</span>  node->free.prev = node->free.next = VMA_NULL;</div> +<div class="line"><a name="l12554"></a><span class="lineno">12554</span>  m_FreeList[level].front = m_FreeList[level].back = node;</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">else</span></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>  m_Name = VMA_NULL;</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> }</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> <span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> -<div class="line"><a name="l12563"></a><span class="lineno">12563</span>  </div> -<div class="line"><a name="l12564"></a><span class="lineno">12564</span> <span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l12558"></a><span class="lineno">12558</span>  VMA_ASSERT(frontNode->free.prev == VMA_NULL);</div> +<div class="line"><a name="l12559"></a><span class="lineno">12559</span>  node->free.prev = VMA_NULL;</div> +<div class="line"><a name="l12560"></a><span class="lineno">12560</span>  node->free.next = frontNode;</div> +<div class="line"><a name="l12561"></a><span class="lineno">12561</span>  frontNode->free.prev = node;</div> +<div class="line"><a name="l12562"></a><span class="lineno">12562</span>  m_FreeList[level].front = node;</div> +<div class="line"><a name="l12563"></a><span class="lineno">12563</span>  }</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>  </div> -<div class="line"><a name="l12566"></a><span class="lineno">12566</span> VmaBlockVector::VmaBlockVector(</div> -<div class="line"><a name="l12567"></a><span class="lineno">12567</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> -<div class="line"><a name="l12568"></a><span class="lineno">12568</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> -<div class="line"><a name="l12569"></a><span class="lineno">12569</span>  uint32_t memoryTypeIndex,</div> -<div class="line"><a name="l12570"></a><span class="lineno">12570</span>  VkDeviceSize preferredBlockSize,</div> -<div class="line"><a name="l12571"></a><span class="lineno">12571</span>  <span class="keywordtype">size_t</span> minBlockCount,</div> -<div class="line"><a name="l12572"></a><span class="lineno">12572</span>  <span class="keywordtype">size_t</span> maxBlockCount,</div> -<div class="line"><a name="l12573"></a><span class="lineno">12573</span>  VkDeviceSize bufferImageGranularity,</div> -<div class="line"><a name="l12574"></a><span class="lineno">12574</span>  uint32_t frameInUseCount,</div> -<div class="line"><a name="l12575"></a><span class="lineno">12575</span>  <span class="keywordtype">bool</span> explicitBlockSize,</div> -<div class="line"><a name="l12576"></a><span class="lineno">12576</span>  uint32_t algorithm) :</div> -<div class="line"><a name="l12577"></a><span class="lineno">12577</span>  m_hAllocator(hAllocator),</div> -<div class="line"><a name="l12578"></a><span class="lineno">12578</span>  m_hParentPool(hParentPool),</div> -<div class="line"><a name="l12579"></a><span class="lineno">12579</span>  m_MemoryTypeIndex(memoryTypeIndex),</div> -<div class="line"><a name="l12580"></a><span class="lineno">12580</span>  m_PreferredBlockSize(preferredBlockSize),</div> -<div class="line"><a name="l12581"></a><span class="lineno">12581</span>  m_MinBlockCount(minBlockCount),</div> -<div class="line"><a name="l12582"></a><span class="lineno">12582</span>  m_MaxBlockCount(maxBlockCount),</div> -<div class="line"><a name="l12583"></a><span class="lineno">12583</span>  m_BufferImageGranularity(bufferImageGranularity),</div> -<div class="line"><a name="l12584"></a><span class="lineno">12584</span>  m_FrameInUseCount(frameInUseCount),</div> -<div class="line"><a name="l12585"></a><span class="lineno">12585</span>  m_ExplicitBlockSize(explicitBlockSize),</div> -<div class="line"><a name="l12586"></a><span class="lineno">12586</span>  m_Algorithm(algorithm),</div> -<div class="line"><a name="l12587"></a><span class="lineno">12587</span>  m_HasEmptyBlock(false),</div> -<div class="line"><a name="l12588"></a><span class="lineno">12588</span>  m_Blocks(VmaStlAllocator<VmaDeviceMemoryBlock*>(hAllocator->GetAllocationCallbacks())),</div> -<div class="line"><a name="l12589"></a><span class="lineno">12589</span>  m_NextBlockId(0)</div> -<div class="line"><a name="l12590"></a><span class="lineno">12590</span> {</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>  </div> -<div class="line"><a name="l12593"></a><span class="lineno">12593</span> VmaBlockVector::~VmaBlockVector()</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>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</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>  m_Blocks[i]->Destroy(m_hAllocator);</div> -<div class="line"><a name="l12598"></a><span class="lineno">12598</span>  vma_delete(m_hAllocator, m_Blocks[i]);</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> VkResult VmaBlockVector::CreateMinBlocks()</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>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i < m_MinBlockCount; ++i)</div> -<div class="line"><a name="l12605"></a><span class="lineno">12605</span>  {</div> -<div class="line"><a name="l12606"></a><span class="lineno">12606</span>  VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div> -<div class="line"><a name="l12607"></a><span class="lineno">12607</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</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>  <span class="keywordflow">return</span> res;</div> -<div class="line"><a name="l12610"></a><span class="lineno">12610</span>  }</div> -<div class="line"><a name="l12611"></a><span class="lineno">12611</span>  }</div> -<div class="line"><a name="l12612"></a><span class="lineno">12612</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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> <span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div> -<div class="line"><a name="l12616"></a><span class="lineno">12616</span> {</div> -<div class="line"><a name="l12617"></a><span class="lineno">12617</span>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12618"></a><span class="lineno">12618</span>  </div> -<div class="line"><a name="l12619"></a><span class="lineno">12619</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</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>  pStats-><a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div> -<div class="line"><a name="l12622"></a><span class="lineno">12622</span>  pStats-><a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div> -<div class="line"><a name="l12623"></a><span class="lineno">12623</span>  pStats-><a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div> -<div class="line"><a name="l12624"></a><span class="lineno">12624</span>  pStats-><a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div> -<div class="line"><a name="l12625"></a><span class="lineno">12625</span>  pStats-><a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div> -<div class="line"><a name="l12626"></a><span class="lineno">12626</span>  pStats-><a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</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>  <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex < blockCount; ++blockIndex)</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> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div> -<div class="line"><a name="l12631"></a><span class="lineno">12631</span>  VMA_ASSERT(pBlock);</div> -<div class="line"><a name="l12632"></a><span class="lineno">12632</span>  VMA_HEAVY_ASSERT(pBlock->Validate());</div> -<div class="line"><a name="l12633"></a><span class="lineno">12633</span>  pBlock->m_pMetadata->AddPoolStats(*pStats);</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> }</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="keywordtype">bool</span> VmaBlockVector::IsEmpty()</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>  VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12640"></a><span class="lineno">12640</span>  <span class="keywordflow">return</span> m_Blocks.empty();</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>  </div> -<div class="line"><a name="l12643"></a><span class="lineno">12643</span> <span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div> -<div class="line"><a name="l12644"></a><span class="lineno">12644</span> <span class="keyword"></span>{</div> -<div class="line"><a name="l12645"></a><span class="lineno">12645</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="l12646"></a><span class="lineno">12646</span>  <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &&</div> -<div class="line"><a name="l12647"></a><span class="lineno">12647</span>  (VMA_DEBUG_MARGIN > 0) &&</div> -<div class="line"><a name="l12648"></a><span class="lineno">12648</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="l12649"></a><span class="lineno">12649</span>  (m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags;</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> <span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</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> VkResult VmaBlockVector::Allocate(</div> -<div class="line"><a name="l12655"></a><span class="lineno">12655</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l12656"></a><span class="lineno">12656</span>  VkDeviceSize size,</div> -<div class="line"><a name="l12657"></a><span class="lineno">12657</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l12658"></a><span class="lineno">12658</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="l12659"></a><span class="lineno">12659</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l12660"></a><span class="lineno">12660</span>  <span class="keywordtype">size_t</span> allocationCount,</div> -<div class="line"><a name="l12661"></a><span class="lineno">12661</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations)</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="keywordtype">size_t</span> allocIndex;</div> -<div class="line"><a name="l12664"></a><span class="lineno">12664</span>  VkResult res = VK_SUCCESS;</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>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div> -<div class="line"><a name="l12667"></a><span class="lineno">12667</span>  {</div> -<div class="line"><a name="l12668"></a><span class="lineno">12668</span>  size = VmaAlignUp<VkDeviceSize>(size, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div> -<div class="line"><a name="l12669"></a><span class="lineno">12669</span>  alignment = VmaAlignUp<VkDeviceSize>(alignment, <span class="keyword">sizeof</span>(VMA_CORRUPTION_DETECTION_MAGIC_VALUE));</div> -<div class="line"><a name="l12670"></a><span class="lineno">12670</span>  }</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>  {</div> -<div class="line"><a name="l12673"></a><span class="lineno">12673</span>  VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);</div> -<div class="line"><a name="l12674"></a><span class="lineno">12674</span>  <span class="keywordflow">for</span>(allocIndex = 0; allocIndex < allocationCount; ++allocIndex)</div> -<div class="line"><a name="l12675"></a><span class="lineno">12675</span>  {</div> -<div class="line"><a name="l12676"></a><span class="lineno">12676</span>  res = AllocatePage(</div> -<div class="line"><a name="l12677"></a><span class="lineno">12677</span>  currentFrameIndex,</div> -<div class="line"><a name="l12678"></a><span class="lineno">12678</span>  size,</div> -<div class="line"><a name="l12679"></a><span class="lineno">12679</span>  alignment,</div> -<div class="line"><a name="l12680"></a><span class="lineno">12680</span>  createInfo,</div> -<div class="line"><a name="l12681"></a><span class="lineno">12681</span>  suballocType,</div> -<div class="line"><a name="l12682"></a><span class="lineno">12682</span>  pAllocations + allocIndex);</div> -<div class="line"><a name="l12683"></a><span class="lineno">12683</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div> -<div class="line"><a name="l12684"></a><span class="lineno">12684</span>  {</div> -<div class="line"><a name="l12685"></a><span class="lineno">12685</span>  <span class="keywordflow">break</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>  }</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">if</span>(res != VK_SUCCESS)</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>  <span class="comment">// Free all already created allocations.</span></div> -<div class="line"><a name="l12693"></a><span class="lineno">12693</span>  <span class="keywordflow">while</span>(allocIndex--)</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>  Free(pAllocations[allocIndex]);</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>  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="l12698"></a><span class="lineno">12698</span>  }</div> -<div class="line"><a name="l12699"></a><span class="lineno">12699</span>  </div> -<div class="line"><a name="l12700"></a><span class="lineno">12700</span>  <span class="keywordflow">return</span> res;</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> VkResult VmaBlockVector::AllocatePage(</div> -<div class="line"><a name="l12704"></a><span class="lineno">12704</span>  uint32_t currentFrameIndex,</div> -<div class="line"><a name="l12705"></a><span class="lineno">12705</span>  VkDeviceSize size,</div> -<div class="line"><a name="l12706"></a><span class="lineno">12706</span>  VkDeviceSize alignment,</div> -<div class="line"><a name="l12707"></a><span class="lineno">12707</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="l12708"></a><span class="lineno">12708</span>  VmaSuballocationType suballocType,</div> -<div class="line"><a name="l12709"></a><span class="lineno">12709</span>  <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</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>  <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="l12712"></a><span class="lineno">12712</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="l12713"></a><span class="lineno">12713</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="l12714"></a><span class="lineno">12714</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="l12715"></a><span class="lineno">12715</span>  </div> -<div class="line"><a name="l12716"></a><span class="lineno">12716</span>  VkDeviceSize freeMemory;</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>  <span class="keyword">const</span> uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);</div> -<div class="line"><a name="l12719"></a><span class="lineno">12719</span>  <a class="code" href="struct_vma_budget.html">VmaBudget</a> heapBudget = {};</div> -<div class="line"><a name="l12720"></a><span class="lineno">12720</span>  m_hAllocator->GetBudget(&heapBudget, heapIndex, 1);</div> -<div class="line"><a name="l12721"></a><span class="lineno">12721</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="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="keyword">const</span> <span class="keywordtype">bool</span> canFallbackToDedicated = !IsCustomPool();</div> -<div class="line"><a name="l12725"></a><span class="lineno">12725</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div> -<div class="line"><a name="l12726"></a><span class="lineno">12726</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="l12727"></a><span class="lineno">12727</span>  (m_Blocks.size() < m_MaxBlockCount) &&</div> -<div class="line"><a name="l12728"></a><span class="lineno">12728</span>  (freeMemory >= size || !canFallbackToDedicated);</div> -<div class="line"><a name="l12729"></a><span class="lineno">12729</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="l12730"></a><span class="lineno">12730</span>  </div> -<div class="line"><a name="l12731"></a><span class="lineno">12731</span>  <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div> -<div class="line"><a name="l12732"></a><span class="lineno">12732</span>  <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div> -<div class="line"><a name="l12733"></a><span class="lineno">12733</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="l12566"></a><span class="lineno">12566</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</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>  VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</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>  <span class="comment">// It is at the front.</span></div> +<div class="line"><a name="l12571"></a><span class="lineno">12571</span>  <span class="keywordflow">if</span>(node->free.prev == VMA_NULL)</div> +<div class="line"><a name="l12572"></a><span class="lineno">12572</span>  {</div> +<div class="line"><a name="l12573"></a><span class="lineno">12573</span>  VMA_ASSERT(m_FreeList[level].front == node);</div> +<div class="line"><a name="l12574"></a><span class="lineno">12574</span>  m_FreeList[level].front = node->free.next;</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>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l12577"></a><span class="lineno">12577</span>  {</div> +<div class="line"><a name="l12578"></a><span class="lineno">12578</span>  Node* <span class="keyword">const</span> prevFreeNode = node->free.prev;</div> +<div class="line"><a name="l12579"></a><span class="lineno">12579</span>  VMA_ASSERT(prevFreeNode->free.next == node);</div> +<div class="line"><a name="l12580"></a><span class="lineno">12580</span>  prevFreeNode->free.next = node->free.next;</div> +<div class="line"><a name="l12581"></a><span class="lineno">12581</span>  }</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">// It is at the back.</span></div> +<div class="line"><a name="l12584"></a><span class="lineno">12584</span>  <span class="keywordflow">if</span>(node->free.next == VMA_NULL)</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>  VMA_ASSERT(m_FreeList[level].back == node);</div> +<div class="line"><a name="l12587"></a><span class="lineno">12587</span>  m_FreeList[level].back = node->free.prev;</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="keywordflow">else</span></div> +<div class="line"><a name="l12590"></a><span class="lineno">12590</span>  {</div> +<div class="line"><a name="l12591"></a><span class="lineno">12591</span>  Node* <span class="keyword">const</span> nextFreeNode = node->free.next;</div> +<div class="line"><a name="l12592"></a><span class="lineno">12592</span>  VMA_ASSERT(nextFreeNode->free.prev == node);</div> +<div class="line"><a name="l12593"></a><span class="lineno">12593</span>  nextFreeNode->free.prev = node->free.prev;</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> +<div class="line"><a name="l12598"></a><span class="lineno">12598</span> <span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter& json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div> +<div class="line"><a name="l12599"></a><span class="lineno">12599</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12600"></a><span class="lineno">12600</span>  <span class="keywordflow">switch</span>(node->type)</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>  <span class="keywordflow">case</span> Node::TYPE_FREE:</div> +<div class="line"><a name="l12603"></a><span class="lineno">12603</span>  PrintDetailedMap_UnusedRange(json, node->offset, levelNodeSize);</div> +<div class="line"><a name="l12604"></a><span class="lineno">12604</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12605"></a><span class="lineno">12605</span>  <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</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>  PrintDetailedMap_Allocation(json, node->offset, node->allocation.alloc);</div> +<div class="line"><a name="l12608"></a><span class="lineno">12608</span>  <span class="keyword">const</span> VkDeviceSize allocSize = node->allocation.alloc->GetSize();</div> +<div class="line"><a name="l12609"></a><span class="lineno">12609</span>  <span class="keywordflow">if</span>(allocSize < levelNodeSize)</div> +<div class="line"><a name="l12610"></a><span class="lineno">12610</span>  {</div> +<div class="line"><a name="l12611"></a><span class="lineno">12611</span>  PrintDetailedMap_UnusedRange(json, node->offset + allocSize, levelNodeSize - allocSize);</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>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12615"></a><span class="lineno">12615</span>  <span class="keywordflow">case</span> Node::TYPE_SPLIT:</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>  <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div> +<div class="line"><a name="l12618"></a><span class="lineno">12618</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node->split.leftChild;</div> +<div class="line"><a name="l12619"></a><span class="lineno">12619</span>  PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div> +<div class="line"><a name="l12620"></a><span class="lineno">12620</span>  <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild->buddy;</div> +<div class="line"><a name="l12621"></a><span class="lineno">12621</span>  PrintDetailedMapNode(json, rightChild, childrenNodeSize);</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>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12624"></a><span class="lineno">12624</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l12625"></a><span class="lineno">12625</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l12626"></a><span class="lineno">12626</span>  }</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> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></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>  </div> +<div class="line"><a name="l12632"></a><span class="lineno">12632</span> <span class="comment">// class VmaDeviceMemoryBlock</span></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> VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div> +<div class="line"><a name="l12635"></a><span class="lineno">12635</span>  m_pMetadata(VMA_NULL),</div> +<div class="line"><a name="l12636"></a><span class="lineno">12636</span>  m_MemoryTypeIndex(UINT32_MAX),</div> +<div class="line"><a name="l12637"></a><span class="lineno">12637</span>  m_Id(0),</div> +<div class="line"><a name="l12638"></a><span class="lineno">12638</span>  m_hMemory(VK_NULL_HANDLE),</div> +<div class="line"><a name="l12639"></a><span class="lineno">12639</span>  m_MapCount(0),</div> +<div class="line"><a name="l12640"></a><span class="lineno">12640</span>  m_pMappedData(VMA_NULL)</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> }</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> <span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div> +<div class="line"><a name="l12645"></a><span class="lineno">12645</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l12646"></a><span class="lineno">12646</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> +<div class="line"><a name="l12647"></a><span class="lineno">12647</span>  uint32_t newMemoryTypeIndex,</div> +<div class="line"><a name="l12648"></a><span class="lineno">12648</span>  VkDeviceMemory newMemory,</div> +<div class="line"><a name="l12649"></a><span class="lineno">12649</span>  VkDeviceSize newSize,</div> +<div class="line"><a name="l12650"></a><span class="lineno">12650</span>  uint32_t <span class="keywordtype">id</span>,</div> +<div class="line"><a name="l12651"></a><span class="lineno">12651</span>  uint32_t algorithm)</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>  VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div> +<div class="line"><a name="l12654"></a><span class="lineno">12654</span>  </div> +<div class="line"><a name="l12655"></a><span class="lineno">12655</span>  m_hParentPool = hParentPool;</div> +<div class="line"><a name="l12656"></a><span class="lineno">12656</span>  m_MemoryTypeIndex = newMemoryTypeIndex;</div> +<div class="line"><a name="l12657"></a><span class="lineno">12657</span>  m_Id = id;</div> +<div class="line"><a name="l12658"></a><span class="lineno">12658</span>  m_hMemory = newMemory;</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="keywordflow">switch</span>(algorithm)</div> +<div class="line"><a name="l12661"></a><span class="lineno">12661</span>  {</div> +<div class="line"><a name="l12662"></a><span class="lineno">12662</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div> +<div class="line"><a name="l12663"></a><span class="lineno">12663</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div> +<div class="line"><a name="l12664"></a><span class="lineno">12664</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12665"></a><span class="lineno">12665</span>  <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div> +<div class="line"><a name="l12666"></a><span class="lineno">12666</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div> +<div class="line"><a name="l12667"></a><span class="lineno">12667</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l12668"></a><span class="lineno">12668</span>  <span class="keywordflow">default</span>:</div> +<div class="line"><a name="l12669"></a><span class="lineno">12669</span>  VMA_ASSERT(0);</div> +<div class="line"><a name="l12670"></a><span class="lineno">12670</span>  <span class="comment">// Fall-through.</span></div> +<div class="line"><a name="l12671"></a><span class="lineno">12671</span>  <span class="keywordflow">case</span> 0:</div> +<div class="line"><a name="l12672"></a><span class="lineno">12672</span>  m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</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>  m_pMetadata->Init(newSize);</div> +<div class="line"><a name="l12675"></a><span class="lineno">12675</span> }</div> +<div class="line"><a name="l12676"></a><span class="lineno">12676</span>  </div> +<div class="line"><a name="l12677"></a><span class="lineno">12677</span> <span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</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>  <span class="comment">// This is the most important assert in the entire library.</span></div> +<div class="line"><a name="l12680"></a><span class="lineno">12680</span>  <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div> +<div class="line"><a name="l12681"></a><span class="lineno">12681</span>  VMA_ASSERT(m_pMetadata->IsEmpty() && <span class="stringliteral">"Some allocations were not freed before destruction of this memory block!"</span>);</div> +<div class="line"><a name="l12682"></a><span class="lineno">12682</span>  </div> +<div class="line"><a name="l12683"></a><span class="lineno">12683</span>  VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div> +<div class="line"><a name="l12684"></a><span class="lineno">12684</span>  allocator->FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata->GetSize(), m_hMemory);</div> +<div class="line"><a name="l12685"></a><span class="lineno">12685</span>  m_hMemory = VK_NULL_HANDLE;</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>  vma_delete(allocator, m_pMetadata);</div> +<div class="line"><a name="l12688"></a><span class="lineno">12688</span>  m_pMetadata = VMA_NULL;</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>  </div> +<div class="line"><a name="l12691"></a><span class="lineno">12691</span> <span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div> +<div class="line"><a name="l12692"></a><span class="lineno">12692</span> <span class="keyword"></span>{</div> +<div class="line"><a name="l12693"></a><span class="lineno">12693</span>  VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &&</div> +<div class="line"><a name="l12694"></a><span class="lineno">12694</span>  (m_pMetadata->GetSize() != 0));</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>  <span class="keywordflow">return</span> m_pMetadata->Validate();</div> +<div class="line"><a name="l12697"></a><span class="lineno">12697</span> }</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> VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div> +<div class="line"><a name="l12702"></a><span class="lineno">12702</span>  VkResult res = Map(hAllocator, 1, &pData);</div> +<div class="line"><a name="l12703"></a><span class="lineno">12703</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</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>  <span class="keywordflow">return</span> res;</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>  </div> +<div class="line"><a name="l12708"></a><span class="lineno">12708</span>  res = m_pMetadata->CheckCorruption(pData);</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>  Unmap(hAllocator, 1);</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>  <span class="keywordflow">return</span> res;</div> +<div class="line"><a name="l12713"></a><span class="lineno">12713</span> }</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> VkResult VmaDeviceMemoryBlock::Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div> +<div class="line"><a name="l12716"></a><span class="lineno">12716</span> {</div> +<div class="line"><a name="l12717"></a><span class="lineno">12717</span>  <span class="keywordflow">if</span>(count == 0)</div> +<div class="line"><a name="l12718"></a><span class="lineno">12718</span>  {</div> +<div class="line"><a name="l12719"></a><span class="lineno">12719</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> +<div class="line"><a name="l12723"></a><span class="lineno">12723</span>  <span class="keywordflow">if</span>(m_MapCount != 0)</div> +<div class="line"><a name="l12724"></a><span class="lineno">12724</span>  {</div> +<div class="line"><a name="l12725"></a><span class="lineno">12725</span>  m_MapCount += count;</div> +<div class="line"><a name="l12726"></a><span class="lineno">12726</span>  VMA_ASSERT(m_pMappedData != VMA_NULL);</div> +<div class="line"><a name="l12727"></a><span class="lineno">12727</span>  <span class="keywordflow">if</span>(ppData != VMA_NULL)</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>  *ppData = m_pMappedData;</div> +<div class="line"><a name="l12730"></a><span class="lineno">12730</span>  }</div> +<div class="line"><a name="l12731"></a><span class="lineno">12731</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> +<div class="line"><a name="l12732"></a><span class="lineno">12732</span>  }</div> +<div class="line"><a name="l12733"></a><span class="lineno">12733</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l12734"></a><span class="lineno">12734</span>  {</div> -<div class="line"><a name="l12735"></a><span class="lineno">12735</span>  canMakeOtherLost = <span class="keyword">false</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>  </div> -<div class="line"><a name="l12738"></a><span class="lineno">12738</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="l12739"></a><span class="lineno">12739</span>  <span class="keywordflow">if</span>(isUpperAddress &&</div> -<div class="line"><a name="l12740"></a><span class="lineno">12740</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="l12741"></a><span class="lineno">12741</span>  {</div> -<div class="line"><a name="l12742"></a><span class="lineno">12742</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</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>  </div> -<div class="line"><a name="l12745"></a><span class="lineno">12745</span>  <span class="comment">// Validate strategy.</span></div> -<div class="line"><a name="l12746"></a><span class="lineno">12746</span>  <span class="keywordflow">switch</span>(strategy)</div> -<div class="line"><a name="l12747"></a><span class="lineno">12747</span>  {</div> -<div class="line"><a name="l12748"></a><span class="lineno">12748</span>  <span class="keywordflow">case</span> 0:</div> -<div class="line"><a name="l12749"></a><span class="lineno">12749</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="l12750"></a><span class="lineno">12750</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12751"></a><span class="lineno">12751</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="l12752"></a><span class="lineno">12752</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="l12753"></a><span class="lineno">12753</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="l12754"></a><span class="lineno">12754</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l12755"></a><span class="lineno">12755</span>  <span class="keywordflow">default</span>:</div> -<div class="line"><a name="l12756"></a><span class="lineno">12756</span>  <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div> -<div class="line"><a name="l12757"></a><span class="lineno">12757</span>  }</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>  <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="l12760"></a><span class="lineno">12760</span>  <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN > m_PreferredBlockSize)</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>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div> -<div class="line"><a name="l12763"></a><span class="lineno">12763</span>  }</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>  <span class="comment">/*</span></div> -<div class="line"><a name="l12766"></a><span class="lineno">12766</span> <span class="comment"> Under certain condition, this whole section can be skipped for optimization, so</span></div> -<div class="line"><a name="l12767"></a><span class="lineno">12767</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="l12768"></a><span class="lineno">12768</span> <span class="comment"> e.g. for custom pools with linear algorithm.</span></div> -<div class="line"><a name="l12769"></a><span class="lineno">12769</span> <span class="comment"> */</span></div> -<div class="line"><a name="l12770"></a><span class="lineno">12770</span>  <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div> -<div class="line"><a name="l12771"></a><span class="lineno">12771</span>  {</div> -<div class="line"><a name="l12772"></a><span class="lineno">12772</span>  <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div> -<div class="line"><a name="l12773"></a><span class="lineno">12773</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="l12774"></a><span class="lineno">12774</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="l12775"></a><span class="lineno">12775</span>  </div> -<div class="line"><a name="l12776"></a><span class="lineno">12776</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="l12777"></a><span class="lineno">12777</span>  {</div> -<div class="line"><a name="l12778"></a><span class="lineno">12778</span>  <span class="comment">// Use only last block.</span></div> -<div class="line"><a name="l12779"></a><span class="lineno">12779</span>  <span class="keywordflow">if</span>(!m_Blocks.empty())</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>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div> -<div class="line"><a name="l12782"></a><span class="lineno">12782</span>  VMA_ASSERT(pCurrBlock);</div> -<div class="line"><a name="l12783"></a><span class="lineno">12783</span>  VkResult res = AllocateFromBlock(</div> -<div class="line"><a name="l12784"></a><span class="lineno">12784</span>  pCurrBlock,</div> -<div class="line"><a name="l12785"></a><span class="lineno">12785</span>  currentFrameIndex,</div> -<div class="line"><a name="l12786"></a><span class="lineno">12786</span>  size,</div> -<div class="line"><a name="l12787"></a><span class="lineno">12787</span>  alignment,</div> -<div class="line"><a name="l12788"></a><span class="lineno">12788</span>  allocFlagsCopy,</div> -<div class="line"><a name="l12789"></a><span class="lineno">12789</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div> -<div class="line"><a name="l12790"></a><span class="lineno">12790</span>  suballocType,</div> -<div class="line"><a name="l12791"></a><span class="lineno">12791</span>  strategy,</div> -<div class="line"><a name="l12792"></a><span class="lineno">12792</span>  pAllocation);</div> -<div class="line"><a name="l12793"></a><span class="lineno">12793</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</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>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from last block #%u"</span>, pCurrBlock->GetId());</div> -<div class="line"><a name="l12796"></a><span class="lineno">12796</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  }</div> -<div class="line"><a name="l12799"></a><span class="lineno">12799</span>  }</div> -<div class="line"><a name="l12800"></a><span class="lineno">12800</span>  <span class="keywordflow">else</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="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="l12803"></a><span class="lineno">12803</span>  {</div> -<div class="line"><a name="l12804"></a><span class="lineno">12804</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div> -<div class="line"><a name="l12805"></a><span class="lineno">12805</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="l12806"></a><span class="lineno">12806</span>  {</div> -<div class="line"><a name="l12807"></a><span class="lineno">12807</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div> -<div class="line"><a name="l12808"></a><span class="lineno">12808</span>  VMA_ASSERT(pCurrBlock);</div> -<div class="line"><a name="l12809"></a><span class="lineno">12809</span>  VkResult res = AllocateFromBlock(</div> -<div class="line"><a name="l12810"></a><span class="lineno">12810</span>  pCurrBlock,</div> -<div class="line"><a name="l12811"></a><span class="lineno">12811</span>  currentFrameIndex,</div> -<div class="line"><a name="l12812"></a><span class="lineno">12812</span>  size,</div> -<div class="line"><a name="l12813"></a><span class="lineno">12813</span>  alignment,</div> -<div class="line"><a name="l12814"></a><span class="lineno">12814</span>  allocFlagsCopy,</div> -<div class="line"><a name="l12815"></a><span class="lineno">12815</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div> -<div class="line"><a name="l12816"></a><span class="lineno">12816</span>  suballocType,</div> -<div class="line"><a name="l12817"></a><span class="lineno">12817</span>  strategy,</div> -<div class="line"><a name="l12818"></a><span class="lineno">12818</span>  pAllocation);</div> -<div class="line"><a name="l12819"></a><span class="lineno">12819</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div> -<div class="line"><a name="l12820"></a><span class="lineno">12820</span>  {</div> -<div class="line"><a name="l12821"></a><span class="lineno">12821</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div> -<div class="line"><a name="l12822"></a><span class="lineno">12822</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  }</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="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div> -<div class="line"><a name="l12827"></a><span class="lineno">12827</span>  {</div> -<div class="line"><a name="l12828"></a><span class="lineno">12828</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div> -<div class="line"><a name="l12829"></a><span class="lineno">12829</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div> -<div class="line"><a name="l12830"></a><span class="lineno">12830</span>  {</div> -<div class="line"><a name="l12831"></a><span class="lineno">12831</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div> -<div class="line"><a name="l12832"></a><span class="lineno">12832</span>  VMA_ASSERT(pCurrBlock);</div> -<div class="line"><a name="l12833"></a><span class="lineno">12833</span>  VkResult res = AllocateFromBlock(</div> -<div class="line"><a name="l12834"></a><span class="lineno">12834</span>  pCurrBlock,</div> -<div class="line"><a name="l12835"></a><span class="lineno">12835</span>  currentFrameIndex,</div> -<div class="line"><a name="l12836"></a><span class="lineno">12836</span>  size,</div> -<div class="line"><a name="l12837"></a><span class="lineno">12837</span>  alignment,</div> -<div class="line"><a name="l12838"></a><span class="lineno">12838</span>  allocFlagsCopy,</div> -<div class="line"><a name="l12839"></a><span class="lineno">12839</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div> -<div class="line"><a name="l12840"></a><span class="lineno">12840</span>  suballocType,</div> -<div class="line"><a name="l12841"></a><span class="lineno">12841</span>  strategy,</div> -<div class="line"><a name="l12842"></a><span class="lineno">12842</span>  pAllocation);</div> -<div class="line"><a name="l12843"></a><span class="lineno">12843</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</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>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block #%u"</span>, pCurrBlock->GetId());</div> -<div class="line"><a name="l12846"></a><span class="lineno">12846</span>  <span class="keywordflow">return</span> VK_SUCCESS;</div> -<div class="line"><a name="l12847"></a><span class="lineno">12847</span>  }</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>  }</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>  </div> -<div class="line"><a name="l12852"></a><span class="lineno">12852</span>  <span class="comment">// 2. Try to create new block.</span></div> -<div class="line"><a name="l12853"></a><span class="lineno">12853</span>  <span class="keywordflow">if</span>(canCreateNewBlock)</div> -<div class="line"><a name="l12854"></a><span class="lineno">12854</span>  {</div> -<div class="line"><a name="l12855"></a><span class="lineno">12855</span>  <span class="comment">// Calculate optimal size for new block.</span></div> -<div class="line"><a name="l12856"></a><span class="lineno">12856</span>  VkDeviceSize newBlockSize = m_PreferredBlockSize;</div> -<div class="line"><a name="l12857"></a><span class="lineno">12857</span>  uint32_t newBlockSizeShift = 0;</div> -<div class="line"><a name="l12858"></a><span class="lineno">12858</span>  <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</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="keywordflow">if</span>(!m_ExplicitBlockSize)</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>  <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div> -<div class="line"><a name="l12863"></a><span class="lineno">12863</span>  <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div> -<div class="line"><a name="l12864"></a><span class="lineno">12864</span>  <span class="keywordflow">for</span>(uint32_t i = 0; i < NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div> -<div class="line"><a name="l12865"></a><span class="lineno">12865</span>  {</div> -<div class="line"><a name="l12866"></a><span class="lineno">12866</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div> -<div class="line"><a name="l12867"></a><span class="lineno">12867</span>  <span class="keywordflow">if</span>(smallerNewBlockSize > maxExistingBlockSize && smallerNewBlockSize >= size * 2)</div> -<div class="line"><a name="l12868"></a><span class="lineno">12868</span>  {</div> -<div class="line"><a name="l12869"></a><span class="lineno">12869</span>  newBlockSize = smallerNewBlockSize;</div> -<div class="line"><a name="l12870"></a><span class="lineno">12870</span>  ++newBlockSizeShift;</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">else</span></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">break</span>;</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>  </div> -<div class="line"><a name="l12879"></a><span class="lineno">12879</span>  <span class="keywordtype">size_t</span> newBlockIndex = 0;</div> -<div class="line"><a name="l12880"></a><span class="lineno">12880</span>  VkResult res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div> -<div class="line"><a name="l12881"></a><span class="lineno">12881</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div> -<div class="line"><a name="l12882"></a><span class="lineno">12882</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="l12883"></a><span class="lineno">12883</span>  <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</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>  <span class="keywordflow">while</span>(res < 0 && newBlockSizeShift < NEW_BLOCK_SIZE_SHIFT_MAX)</div> -<div class="line"><a name="l12886"></a><span class="lineno">12886</span>  {</div> -<div class="line"><a name="l12887"></a><span class="lineno">12887</span>  <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div> -<div class="line"><a name="l12888"></a><span class="lineno">12888</span>  <span class="keywordflow">if</span>(smallerNewBlockSize >= size)</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>  newBlockSize = smallerNewBlockSize;</div> -<div class="line"><a name="l12891"></a><span class="lineno">12891</span>  ++newBlockSizeShift;</div> -<div class="line"><a name="l12892"></a><span class="lineno">12892</span>  res = (newBlockSize <= freeMemory || !canFallbackToDedicated) ?</div> -<div class="line"><a name="l12893"></a><span class="lineno">12893</span>  CreateBlock(newBlockSize, &newBlockIndex) : VK_ERROR_OUT_OF_DEVICE_MEMORY;</div> -<div class="line"><a name="l12894"></a><span class="lineno">12894</span>  }</div> -<div class="line"><a name="l12895"></a><span class="lineno">12895</span>  <span class="keywordflow">else</span></div> -<div class="line"><a name="l12896"></a><span class="lineno">12896</span>  {</div> -<div class="line"><a name="l12897"></a><span class="lineno">12897</span>  <span class="keywordflow">break</span>;</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>  </div> -<div class="line"><a name="l12902"></a><span class="lineno">12902</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</div> -<div class="line"><a name="l12903"></a><span class="lineno">12903</span>  {</div> -<div class="line"><a name="l12904"></a><span class="lineno">12904</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div> -<div class="line"><a name="l12905"></a><span class="lineno">12905</span>  VMA_ASSERT(pBlock->m_pMetadata->GetSize() >= size);</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>  res = AllocateFromBlock(</div> -<div class="line"><a name="l12908"></a><span class="lineno">12908</span>  pBlock,</div> -<div class="line"><a name="l12909"></a><span class="lineno">12909</span>  currentFrameIndex,</div> -<div class="line"><a name="l12910"></a><span class="lineno">12910</span>  size,</div> -<div class="line"><a name="l12911"></a><span class="lineno">12911</span>  alignment,</div> -<div class="line"><a name="l12912"></a><span class="lineno">12912</span>  allocFlagsCopy,</div> -<div class="line"><a name="l12913"></a><span class="lineno">12913</span>  createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div> -<div class="line"><a name="l12914"></a><span class="lineno">12914</span>  suballocType,</div> -<div class="line"><a name="l12915"></a><span class="lineno">12915</span>  strategy,</div> -<div class="line"><a name="l12916"></a><span class="lineno">12916</span>  pAllocation);</div> -<div class="line"><a name="l12917"></a><span class="lineno">12917</span>  <span class="keywordflow">if</span>(res == VK_SUCCESS)</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>  VMA_DEBUG_LOG(<span class="stringliteral">" Created new block #%u Size=%llu"</span>, pBlock->GetId(), newBlockSize);</div> -<div class="line"><a name="l12920"></a><span class="lineno">12920</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  <span class="keywordflow">else</span></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>  <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div> -<div class="line"><a name="l12925"></a><span class="lineno">12925</span>  <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</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>  }</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>  }</div> +<div class="line"><a name="l12735"></a><span class="lineno">12735</span>  VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(</div> +<div class="line"><a name="l12736"></a><span class="lineno">12736</span>  hAllocator->m_hDevice,</div> +<div class="line"><a name="l12737"></a><span class="lineno">12737</span>  m_hMemory,</div> +<div class="line"><a name="l12738"></a><span class="lineno">12738</span>  0, <span class="comment">// offset</span></div> +<div class="line"><a name="l12739"></a><span class="lineno">12739</span>  VK_WHOLE_SIZE,</div> +<div class="line"><a name="l12740"></a><span class="lineno">12740</span>  0, <span class="comment">// flags</span></div> +<div class="line"><a name="l12741"></a><span class="lineno">12741</span>  &m_pMappedData);</div> +<div class="line"><a name="l12742"></a><span class="lineno">12742</span>  <span class="keywordflow">if</span>(result == VK_SUCCESS)</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>  <span class="keywordflow">if</span>(ppData != VMA_NULL)</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>  *ppData = m_pMappedData;</div> +<div class="line"><a name="l12747"></a><span class="lineno">12747</span>  }</div> +<div class="line"><a name="l12748"></a><span class="lineno">12748</span>  m_MapCount = count;</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>  <span class="keywordflow">return</span> result;</div> +<div class="line"><a name="l12751"></a><span class="lineno">12751</span>  }</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>  </div> +<div class="line"><a name="l12754"></a><span class="lineno">12754</span> <span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div> +<div class="line"><a name="l12755"></a><span class="lineno">12755</span> {</div> +<div class="line"><a name="l12756"></a><span class="lineno">12756</span>  <span class="keywordflow">if</span>(count == 0)</div> +<div class="line"><a name="l12757"></a><span class="lineno">12757</span>  {</div> +<div class="line"><a name="l12758"></a><span class="lineno">12758</span>  <span class="keywordflow">return</span>;</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>  </div> +<div class="line"><a name="l12761"></a><span class="lineno">12761</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> +<div class="line"><a name="l12762"></a><span class="lineno">12762</span>  <span class="keywordflow">if</span>(m_MapCount >= count)</div> +<div class="line"><a name="l12763"></a><span class="lineno">12763</span>  {</div> +<div class="line"><a name="l12764"></a><span class="lineno">12764</span>  m_MapCount -= count;</div> +<div class="line"><a name="l12765"></a><span class="lineno">12765</span>  <span class="keywordflow">if</span>(m_MapCount == 0)</div> +<div class="line"><a name="l12766"></a><span class="lineno">12766</span>  {</div> +<div class="line"><a name="l12767"></a><span class="lineno">12767</span>  m_pMappedData = VMA_NULL;</div> +<div class="line"><a name="l12768"></a><span class="lineno">12768</span>  (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, m_hMemory);</div> +<div class="line"><a name="l12769"></a><span class="lineno">12769</span>  }</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>  <span class="keywordflow">else</span></div> +<div class="line"><a name="l12772"></a><span class="lineno">12772</span>  {</div> +<div class="line"><a name="l12773"></a><span class="lineno">12773</span>  VMA_ASSERT(0 && <span class="stringliteral">"VkDeviceMemory block is being unmapped while it was not previously mapped."</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> }</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> VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div> +<div class="line"><a name="l12778"></a><span class="lineno">12778</span> {</div> +<div class="line"><a name="l12779"></a><span class="lineno">12779</span>  VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);</div> +<div class="line"><a name="l12780"></a><span class="lineno">12780</span>  VMA_ASSERT(allocOffset >= VMA_DEBUG_MARGIN);</div> +<div class="line"><a name="l12781"></a><span class="lineno">12781</span>  </div> +<div class="line"><a name="l12782"></a><span class="lineno">12782</span>  <span class="keywordtype">void</span>* pData;</div> +<div class="line"><a name="l12783"></a><span class="lineno">12783</span>  VkResult res = Map(hAllocator, 1, &pData);</div> +<div class="line"><a name="l12784"></a><span class="lineno">12784</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</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>  <span class="keywordflow">return</span> res;</div> +<div class="line"><a name="l12787"></a><span class="lineno">12787</span>  }</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>  VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div> +<div class="line"><a name="l12790"></a><span class="lineno">12790</span>  VmaWriteMagicValue(pData, allocOffset + allocSize);</div> +<div class="line"><a name="l12791"></a><span class="lineno">12791</span>  </div> +<div class="line"><a name="l12792"></a><span class="lineno">12792</span>  Unmap(hAllocator, 1);</div> +<div class="line"><a name="l12793"></a><span class="lineno">12793</span>  </div> +<div class="line"><a name="l12794"></a><span class="lineno">12794</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  </div> +<div class="line"><a name="l12797"></a><span class="lineno">12797</span> VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</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>  VMA_ASSERT(VMA_DEBUG_MARGIN > 0 && VMA_DEBUG_MARGIN % 4 == 0 && VMA_DEBUG_DETECT_CORRUPTION);</div> +<div class="line"><a name="l12800"></a><span class="lineno">12800</span>  VMA_ASSERT(allocOffset >= VMA_DEBUG_MARGIN);</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="keywordtype">void</span>* pData;</div> +<div class="line"><a name="l12803"></a><span class="lineno">12803</span>  VkResult res = Map(hAllocator, 1, &pData);</div> +<div class="line"><a name="l12804"></a><span class="lineno">12804</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div> +<div class="line"><a name="l12805"></a><span class="lineno">12805</span>  {</div> +<div class="line"><a name="l12806"></a><span class="lineno">12806</span>  <span class="keywordflow">return</span> res;</div> +<div class="line"><a name="l12807"></a><span class="lineno">12807</span>  }</div> +<div class="line"><a name="l12808"></a><span class="lineno">12808</span>  </div> +<div class="line"><a name="l12809"></a><span class="lineno">12809</span>  <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</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>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!"</span>);</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="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div> +<div class="line"><a name="l12814"></a><span class="lineno">12814</span>  {</div> +<div class="line"><a name="l12815"></a><span class="lineno">12815</span>  VMA_ASSERT(0 && <span class="stringliteral">"MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!"</span>);</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>  </div> +<div class="line"><a name="l12818"></a><span class="lineno">12818</span>  Unmap(hAllocator, 1);</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="keywordflow">return</span> VK_SUCCESS;</div> +<div class="line"><a name="l12821"></a><span class="lineno">12821</span> }</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> VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div> +<div class="line"><a name="l12824"></a><span class="lineno">12824</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l12825"></a><span class="lineno">12825</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l12826"></a><span class="lineno">12826</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l12827"></a><span class="lineno">12827</span>  VkBuffer hBuffer,</div> +<div class="line"><a name="l12828"></a><span class="lineno">12828</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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>  VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&</div> +<div class="line"><a name="l12831"></a><span class="lineno">12831</span>  hAllocation->GetBlock() == <span class="keyword">this</span>);</div> +<div class="line"><a name="l12832"></a><span class="lineno">12832</span>  VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&</div> +<div class="line"><a name="l12833"></a><span class="lineno">12833</span>  <span class="stringliteral">"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?"</span>);</div> +<div class="line"><a name="l12834"></a><span class="lineno">12834</span>  <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;</div> +<div class="line"><a name="l12835"></a><span class="lineno">12835</span>  <span class="comment">// This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div> +<div class="line"><a name="l12836"></a><span class="lineno">12836</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> +<div class="line"><a name="l12837"></a><span class="lineno">12837</span>  <span class="keywordflow">return</span> hAllocator->BindVulkanBuffer(m_hMemory, memoryOffset, hBuffer, pNext);</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>  </div> +<div class="line"><a name="l12840"></a><span class="lineno">12840</span> VkResult VmaDeviceMemoryBlock::BindImageMemory(</div> +<div class="line"><a name="l12841"></a><span class="lineno">12841</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l12842"></a><span class="lineno">12842</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div> +<div class="line"><a name="l12843"></a><span class="lineno">12843</span>  VkDeviceSize allocationLocalOffset,</div> +<div class="line"><a name="l12844"></a><span class="lineno">12844</span>  VkImage hImage,</div> +<div class="line"><a name="l12845"></a><span class="lineno">12845</span>  <span class="keyword">const</span> <span class="keywordtype">void</span>* pNext)</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>  VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&</div> +<div class="line"><a name="l12848"></a><span class="lineno">12848</span>  hAllocation->GetBlock() == <span class="keyword">this</span>);</div> +<div class="line"><a name="l12849"></a><span class="lineno">12849</span>  VMA_ASSERT(allocationLocalOffset < hAllocation->GetSize() &&</div> +<div class="line"><a name="l12850"></a><span class="lineno">12850</span>  <span class="stringliteral">"Invalid allocationLocalOffset. Did you forget that this offset is relative to the beginning of the allocation, not the whole memory block?"</span>);</div> +<div class="line"><a name="l12851"></a><span class="lineno">12851</span>  <span class="keyword">const</span> VkDeviceSize memoryOffset = hAllocation->GetOffset() + allocationLocalOffset;</div> +<div class="line"><a name="l12852"></a><span class="lineno">12852</span>  <span class="comment">// This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div> +<div class="line"><a name="l12853"></a><span class="lineno">12853</span>  VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);</div> +<div class="line"><a name="l12854"></a><span class="lineno">12854</span>  <span class="keywordflow">return</span> hAllocator->BindVulkanImage(m_hMemory, memoryOffset, hImage, pNext);</div> +<div class="line"><a name="l12855"></a><span class="lineno">12855</span> }</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="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& outInfo)</div> +<div class="line"><a name="l12858"></a><span class="lineno">12858</span> {</div> +<div class="line"><a name="l12859"></a><span class="lineno">12859</span>  memset(&outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div> +<div class="line"><a name="l12860"></a><span class="lineno">12860</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l12861"></a><span class="lineno">12861</span>  outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div> +<div class="line"><a name="l12862"></a><span class="lineno">12862</span> }</div> +<div class="line"><a name="l12863"></a><span class="lineno">12863</span>  </div> +<div class="line"><a name="l12864"></a><span class="lineno">12864</span> <span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div> +<div class="line"><a name="l12865"></a><span class="lineno">12865</span> <span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& srcInfo)</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>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div> +<div class="line"><a name="l12868"></a><span class="lineno">12868</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div> +<div class="line"><a name="l12869"></a><span class="lineno">12869</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div> +<div class="line"><a name="l12870"></a><span class="lineno">12870</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div> +<div class="line"><a name="l12871"></a><span class="lineno">12871</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div> +<div class="line"><a name="l12872"></a><span class="lineno">12872</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div> +<div class="line"><a name="l12873"></a><span class="lineno">12873</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div> +<div class="line"><a name="l12874"></a><span class="lineno">12874</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div> +<div class="line"><a name="l12875"></a><span class="lineno">12875</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div> +<div class="line"><a name="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="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>& inoutInfo)</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>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> > 0) ?</div> +<div class="line"><a name="l12881"></a><span class="lineno">12881</span>  VmaRoundDiv<VkDeviceSize>(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div> +<div class="line"><a name="l12882"></a><span class="lineno">12882</span>  inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> > 0) ?</div> +<div class="line"><a name="l12883"></a><span class="lineno">12883</span>  VmaRoundDiv<VkDeviceSize>(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div> +<div class="line"><a name="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> VmaPool_T::VmaPool_T(</div> +<div class="line"><a name="l12887"></a><span class="lineno">12887</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l12888"></a><span class="lineno">12888</span>  <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>& createInfo,</div> +<div class="line"><a name="l12889"></a><span class="lineno">12889</span>  VkDeviceSize preferredBlockSize) :</div> +<div class="line"><a name="l12890"></a><span class="lineno">12890</span>  m_BlockVector(</div> +<div class="line"><a name="l12891"></a><span class="lineno">12891</span>  hAllocator,</div> +<div class="line"><a name="l12892"></a><span class="lineno">12892</span>  this, <span class="comment">// hParentPool</span></div> +<div class="line"><a name="l12893"></a><span class="lineno">12893</span>  createInfo.memoryTypeIndex,</div> +<div class="line"><a name="l12894"></a><span class="lineno">12894</span>  createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div> +<div class="line"><a name="l12895"></a><span class="lineno">12895</span>  createInfo.minBlockCount,</div> +<div class="line"><a name="l12896"></a><span class="lineno">12896</span>  createInfo.maxBlockCount,</div> +<div class="line"><a name="l12897"></a><span class="lineno">12897</span>  (createInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator->GetBufferImageGranularity(),</div> +<div class="line"><a name="l12898"></a><span class="lineno">12898</span>  createInfo.frameInUseCount,</div> +<div class="line"><a name="l12899"></a><span class="lineno">12899</span>  createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div> +<div class="line"><a name="l12900"></a><span class="lineno">12900</span>  createInfo.flags & <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>, <span class="comment">// algorithm</span></div> +<div class="line"><a name="l12901"></a><span class="lineno">12901</span>  createInfo.priority,</div> +<div class="line"><a name="l12902"></a><span class="lineno">12902</span>  VMA_MAX(hAllocator->GetMemoryTypeMinAlignment(createInfo.memoryTypeIndex), createInfo.minAllocationAlignment),</div> +<div class="line"><a name="l12903"></a><span class="lineno">12903</span>  createInfo.pMemoryAllocateNext),</div> +<div class="line"><a name="l12904"></a><span class="lineno">12904</span>  m_Id(0),</div> +<div class="line"><a name="l12905"></a><span class="lineno">12905</span>  m_Name(VMA_NULL)</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> }</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> VmaPool_T::~VmaPool_T()</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>  VMA_ASSERT(m_PrevPool == VMA_NULL && m_NextPool == VMA_NULL);</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>  </div> +<div class="line"><a name="l12914"></a><span class="lineno">12914</span> <span class="keywordtype">void</span> VmaPool_T::SetName(<span class="keyword">const</span> <span class="keywordtype">char</span>* pName)</div> +<div class="line"><a name="l12915"></a><span class="lineno">12915</span> {</div> +<div class="line"><a name="l12916"></a><span class="lineno">12916</span>  <span class="keyword">const</span> VkAllocationCallbacks* allocs = m_BlockVector.GetAllocator()->GetAllocationCallbacks();</div> +<div class="line"><a name="l12917"></a><span class="lineno">12917</span>  VmaFreeString(allocs, m_Name);</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="keywordflow">if</span>(pName != VMA_NULL)</div> +<div class="line"><a name="l12920"></a><span class="lineno">12920</span>  {</div> +<div class="line"><a name="l12921"></a><span class="lineno">12921</span>  m_Name = VmaCreateStringCopy(allocs, pName);</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="keywordflow">else</span></div> +<div class="line"><a name="l12924"></a><span class="lineno">12924</span>  {</div> +<div class="line"><a name="l12925"></a><span class="lineno">12925</span>  m_Name = VMA_NULL;</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> }</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div> <div class="line"><a name="l12930"></a><span class="lineno">12930</span>  </div> -<div class="line"><a name="l12931"></a><span class="lineno">12931</span>  <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div> -<div class="line"><a name="l12932"></a><span class="lineno">12932</span>  <span class="keywordflow">if</span>(canMakeOtherLost)</div> -<div class="line"><a name="l12933"></a><span class="lineno">12933</span>  {</div> -<div class="line"><a name="l12934"></a><span class="lineno">12934</span>  uint32_t tryIndex = 0;</div> -<div class="line"><a name="l12935"></a><span class="lineno">12935</span>  <span class="keywordflow">for</span>(; tryIndex < VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</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>  VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div> -<div class="line"><a name="l12938"></a><span class="lineno">12938</span>  VmaAllocationRequest bestRequest = {};</div> -<div class="line"><a name="l12939"></a><span class="lineno">12939</span>  VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div> -<div class="line"><a name="l12940"></a><span class="lineno">12940</span>  </div> -<div class="line"><a name="l12941"></a><span class="lineno">12941</span>  <span class="comment">// 1. Search existing allocations.</span></div> -<div class="line"><a name="l12942"></a><span class="lineno">12942</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="l12943"></a><span class="lineno">12943</span>  {</div> -<div class="line"><a name="l12944"></a><span class="lineno">12944</span>  <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div> -<div class="line"><a name="l12945"></a><span class="lineno">12945</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="l12946"></a><span class="lineno">12946</span>  {</div> -<div class="line"><a name="l12947"></a><span class="lineno">12947</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div> -<div class="line"><a name="l12948"></a><span class="lineno">12948</span>  VMA_ASSERT(pCurrBlock);</div> -<div class="line"><a name="l12949"></a><span class="lineno">12949</span>  VmaAllocationRequest currRequest = {};</div> -<div class="line"><a name="l12950"></a><span class="lineno">12950</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div> -<div class="line"><a name="l12951"></a><span class="lineno">12951</span>  currentFrameIndex,</div> -<div class="line"><a name="l12952"></a><span class="lineno">12952</span>  m_FrameInUseCount,</div> -<div class="line"><a name="l12953"></a><span class="lineno">12953</span>  m_BufferImageGranularity,</div> -<div class="line"><a name="l12954"></a><span class="lineno">12954</span>  size,</div> -<div class="line"><a name="l12955"></a><span class="lineno">12955</span>  alignment,</div> -<div class="line"><a name="l12956"></a><span class="lineno">12956</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="l12957"></a><span class="lineno">12957</span>  suballocType,</div> -<div class="line"><a name="l12958"></a><span class="lineno">12958</span>  canMakeOtherLost,</div> -<div class="line"><a name="l12959"></a><span class="lineno">12959</span>  strategy,</div> -<div class="line"><a name="l12960"></a><span class="lineno">12960</span>  &currRequest))</div> -<div class="line"><a name="l12961"></a><span class="lineno">12961</span>  {</div> -<div class="line"><a name="l12962"></a><span class="lineno">12962</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div> -<div class="line"><a name="l12963"></a><span class="lineno">12963</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div> -<div class="line"><a name="l12964"></a><span class="lineno">12964</span>  currRequestCost < bestRequestCost)</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>  pBestRequestBlock = pCurrBlock;</div> -<div class="line"><a name="l12967"></a><span class="lineno">12967</span>  bestRequest = currRequest;</div> -<div class="line"><a name="l12968"></a><span class="lineno">12968</span>  bestRequestCost = currRequestCost;</div> -<div class="line"><a name="l12969"></a><span class="lineno">12969</span>  </div> -<div class="line"><a name="l12970"></a><span class="lineno">12970</span>  <span class="keywordflow">if</span>(bestRequestCost == 0)</div> -<div class="line"><a name="l12971"></a><span class="lineno">12971</span>  {</div> -<div class="line"><a name="l12972"></a><span class="lineno">12972</span>  <span class="keywordflow">break</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>  }</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>  }</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>  <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div> -<div class="line"><a name="l12979"></a><span class="lineno">12979</span>  {</div> -<div class="line"><a name="l12980"></a><span class="lineno">12980</span>  <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div> -<div class="line"><a name="l12981"></a><span class="lineno">12981</span>  <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div> -<div class="line"><a name="l12982"></a><span class="lineno">12982</span>  {</div> -<div class="line"><a name="l12983"></a><span class="lineno">12983</span>  VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div> -<div class="line"><a name="l12984"></a><span class="lineno">12984</span>  VMA_ASSERT(pCurrBlock);</div> -<div class="line"><a name="l12985"></a><span class="lineno">12985</span>  VmaAllocationRequest currRequest = {};</div> -<div class="line"><a name="l12986"></a><span class="lineno">12986</span>  <span class="keywordflow">if</span>(pCurrBlock->m_pMetadata->CreateAllocationRequest(</div> -<div class="line"><a name="l12987"></a><span class="lineno">12987</span>  currentFrameIndex,</div> -<div class="line"><a name="l12988"></a><span class="lineno">12988</span>  m_FrameInUseCount,</div> -<div class="line"><a name="l12989"></a><span class="lineno">12989</span>  m_BufferImageGranularity,</div> -<div class="line"><a name="l12990"></a><span class="lineno">12990</span>  size,</div> -<div class="line"><a name="l12991"></a><span class="lineno">12991</span>  alignment,</div> -<div class="line"><a name="l12992"></a><span class="lineno">12992</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="l12993"></a><span class="lineno">12993</span>  suballocType,</div> -<div class="line"><a name="l12994"></a><span class="lineno">12994</span>  canMakeOtherLost,</div> -<div class="line"><a name="l12995"></a><span class="lineno">12995</span>  strategy,</div> -<div class="line"><a name="l12996"></a><span class="lineno">12996</span>  &currRequest))</div> -<div class="line"><a name="l12997"></a><span class="lineno">12997</span>  {</div> -<div class="line"><a name="l12998"></a><span class="lineno">12998</span>  <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div> -<div class="line"><a name="l12999"></a><span class="lineno">12999</span>  <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div> -<div class="line"><a name="l13000"></a><span class="lineno">13000</span>  currRequestCost < bestRequestCost ||</div> -<div class="line"><a name="l13001"></a><span class="lineno">13001</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="l13002"></a><span class="lineno">13002</span>  {</div> -<div class="line"><a name="l13003"></a><span class="lineno">13003</span>  pBestRequestBlock = pCurrBlock;</div> -<div class="line"><a name="l13004"></a><span class="lineno">13004</span>  bestRequest = currRequest;</div> -<div class="line"><a name="l13005"></a><span class="lineno">13005</span>  bestRequestCost = currRequestCost;</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>  <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div> -<div class="line"><a name="l13008"></a><span class="lineno">13008</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="l13009"></a><span class="lineno">13009</span>  {</div> -<div class="line"><a name="l13010"></a><span class="lineno">13010</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l13011"></a><span class="lineno">13011</span>  }</div> -<div class="line"><a name="l13012"></a><span class="lineno">13012</span>  }</div> -<div class="line"><a name="l13013"></a><span class="lineno">13013</span>  }</div> -<div class="line"><a name="l13014"></a><span class="lineno">13014</span>  }</div> -<div class="line"><a name="l13015"></a><span class="lineno">13015</span>  }</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="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div> -<div class="line"><a name="l13018"></a><span class="lineno">13018</span>  {</div> -<div class="line"><a name="l13019"></a><span class="lineno">13019</span>  <span class="keywordflow">if</span>(mapped)</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>  VkResult res = pBestRequestBlock->Map(m_hAllocator, 1, VMA_NULL);</div> -<div class="line"><a name="l13022"></a><span class="lineno">13022</span>  <span class="keywordflow">if</span>(res != VK_SUCCESS)</div> -<div class="line"><a name="l13023"></a><span class="lineno">13023</span>  {</div> -<div class="line"><a name="l13024"></a><span class="lineno">13024</span>  <span class="keywordflow">return</span> res;</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>  </div> -<div class="line"><a name="l13028"></a><span class="lineno">13028</span>  <span class="keywordflow">if</span>(pBestRequestBlock->m_pMetadata->MakeRequestedAllocationsLost(</div> -<div class="line"><a name="l13029"></a><span class="lineno">13029</span>  currentFrameIndex,</div> -<div class="line"><a name="l13030"></a><span class="lineno">13030</span>  m_FrameInUseCount,</div> -<div class="line"><a name="l13031"></a><span class="lineno">13031</span>  &bestRequest))</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">// Allocate from this pBlock.</span></div> -<div class="line"><a name="l13034"></a><span class="lineno">13034</span>  *pAllocation = m_hAllocator->m_AllocationObjectAllocator.Allocate(currentFrameIndex, isUserDataString);</div> -<div class="line"><a name="l13035"></a><span class="lineno">13035</span>  pBestRequestBlock->m_pMetadata->Alloc(bestRequest, suballocType, size, *pAllocation);</div> -<div class="line"><a name="l13036"></a><span class="lineno">13036</span>  UpdateHasEmptyBlock();</div> -<div class="line"><a name="l13037"></a><span class="lineno">13037</span>  (*pAllocation)->InitBlockAllocation(</div> -<div class="line"><a name="l13038"></a><span class="lineno">13038</span>  pBestRequestBlock,</div> -<div class="line"><a name="l13039"></a><span class="lineno">13039</span>  bestRequest.offset,</div> -<div class="line"><a name="l13040"></a><span class="lineno">13040</span>  alignment,</div> -<div class="line"><a name="l13041"></a><span class="lineno">13041</span>  size,</div> -<div class="line"><a name="l13042"></a><span class="lineno">13042</span>  m_MemoryTypeIndex,</div> -<div class="line"><a name="l13043"></a><span class="lineno">13043</span>  suballocType,</div> -<div class="line"><a name="l13044"></a><span class="lineno">13044</span>  mapped,</div> -<div class="line"><a name="l13045"></a><span class="lineno">13045</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="l13046"></a><span class="lineno">13046</span>  VMA_HEAVY_ASSERT(pBestRequestBlock->Validate());</div> -<div class="line"><a name="l13047"></a><span class="lineno">13047</span>  VMA_DEBUG_LOG(<span class="stringliteral">" Returned from existing block"</span>);</div> -<div class="line"><a name="l13048"></a><span class="lineno">13048</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="l13049"></a><span class="lineno">13049</span>  m_hAllocator->m_Budget.AddAllocation(m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex), size);</div> -<div class="line"><a name="l13050"></a><span class="lineno">13050</span>  <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div> -<div class="line"><a name="l13051"></a><span class="lineno">13051</span>  {</div> -<div class="line"><a name="l13052"></a><span class="lineno">13052</span>  m_hAllocator->FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</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>  <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</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>  VkResult res = pBestRequestBlock->WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div> -<div class="line"><a name="l13057"></a><span class="lineno">13057</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="l13058"></a><span class="lineno">13058</span>  }</div> -<div class="line"><a name="l13059"></a><span class="lineno">13059</span>  <span class="keywordflow">return</span> VK_SUCCESS;</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>  <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div> -<div class="line"><a name="l13062"></a><span class="lineno">13062</span>  }</div> -<div class="line"><a name="l13063"></a><span class="lineno">13063</span>  <span class="keywordflow">else</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>  <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div> -<div class="line"><a name="l13066"></a><span class="lineno">13066</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l13067"></a><span class="lineno">13067</span>  }</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>  <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div> -<div class="line"><a name="l13070"></a><span class="lineno">13070</span> <span class="comment"> threads are simultaneously touching allocations making it impossible to make</span></div> -<div class="line"><a name="l13071"></a><span class="lineno">13071</span> <span class="comment"> lost at the same time as we try to allocate. */</span></div> -<div class="line"><a name="l13072"></a><span class="lineno">13072</span>  <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div> -<div class="line"><a name="l13073"></a><span class="lineno">13073</span>  {</div> -<div class="line"><a name="l13074"></a><span class="lineno">13074</span>  <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div> +<div class="line"><a name="l12931"></a><span class="lineno">12931</span> <span class="preprocessor">#endif </span><span class="comment">// #if VMA_STATS_STRING_ENABLED</span></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> VmaBlockVector::VmaBlockVector(</div> +<div class="line"><a name="l12934"></a><span class="lineno">12934</span>  <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div> +<div class="line"><a name="l12935"></a><span class="lineno">12935</span>  <a class="code" href="struct_vma_pool.html">VmaPool</a> hParentPool,</div> +<div class="line"><a name="l12936"></a><span class="lineno">12936</span>  uint32_t memoryTypeIndex,</div> +<div class="line"><a name="l12937"></a><span class="lineno">12937</span>  VkDeviceSize preferredBlockSize,</div> +<div class="line"><a name="l12938"></a><span class="lineno">12938</span>  <span class="keywordtype">size_t</span> minBlockCount,</div> +<div class="line"><a name="l12939"></a><span class="lineno">12939</span>  <span class="keywordtype">size_t</span> maxBlockCount,</div> +<div class="line"><a name="l12940"></a><span class="lineno">12940</span>  VkDeviceSize bufferImageGranularity,</div> +<div class="line"><a name="l12941"></a><span class="lineno">12941</span>  uint32_t frameInUseCount,</div> +<div class="line"><a name="l12942"></a><span class="lineno">12942</span>  <span class="keywordtype">bool</span> explicitBlockSize,</div> +<div class="line"><a name="l12943"></a><span class="lineno">12943</span>  uint32_t algorithm,</div> +<div class="line"><a name="l12944"></a><span class="lineno">12944</span>  <span class="keywordtype">float</span> priority,</div> +<div class="line"><a name="l12945"></a><span class="lineno">12945</span>  VkDeviceSize minAllocationAlignment,</div> +<div class="line"><a name="l12946"></a><span class="lineno">12946</span>  <span class="keywordtype">void</span>* pMemoryAllocateNext) :</div> +<div class="line"><a name="l12947"></a><span class="lineno">12947</span>  m_hAllocator(hAllocator),</div> +<div class="line"><a name="l12948"></a><span class="lineno">12948</span>  m_hParentPool(hParentPool),</div> +<div class="line"><a name="l12949"></a><span class="lineno">12949</span>  m_MemoryTypeIndex(memoryTypeIndex),</div> +<div class="line"><a name="l12950"></a><span class="lineno">12950</span>  m_PreferredBlockSize(preferredBlockSize),</div> +<div class="line"><a name="l12951"></a><span class="lineno">12951</span>  m_MinBlockCount(minBlockCount),<