Merge branch 'development' into linear_allocator
diff --git a/README.md b/README.md
index 10be08b..6815d7a 100644
--- a/README.md
+++ b/README.md
@@ -51,6 +51,7 @@
 - JSON dump: Obtain a string in JSON format with detailed map of internal state, including list of allocations and gaps between them.
 - Convert this JSON dump into a picture to visualize your memory. See [tools/VmaDumpVis](tools/VmaDumpVis/README.md).
 - Debugging incorrect memory usage: Enable initialization of all allocated memory with a bit pattern to detect usage of uninitialized or freed memory. Enable validation of a magic number before and after every allocation to detect out-of-bounds memory corruption.
+- Record and replay sequence of calls to library functions to a file to check correctness, measure performance, and gather statistics.
 
 # Prequisites
 
diff --git a/bin/VmaReplay_Release_vs2015.exe b/bin/VmaReplay_Release_vs2015.exe
new file mode 100644
index 0000000..1e08a58
--- /dev/null
+++ b/bin/VmaReplay_Release_vs2015.exe
Binary files differ
diff --git a/bin/VulkanSample_Release_vs2015.exe b/bin/VulkanSample_Release_vs2015.exe
index 05ae82b..3958098 100644
--- a/bin/VulkanSample_Release_vs2015.exe
+++ b/bin/VulkanSample_Release_vs2015.exe
Binary files differ
diff --git a/docs/Recording file format.md b/docs/Recording file format.md
new file mode 100644
index 0000000..b01eaf4
--- /dev/null
+++ b/docs/Recording file format.md
@@ -0,0 +1,287 @@
+This is an official documentation for file format used by Vulkan Memory Allocator library

+to record and replay sequence of calls to its functions.

+This feature can be enabled by using `VmaAllocatorCreateInfo::pRecordSettings` structure members.

+For details, see main documentation of the library.

+Playback can be launched using **VmaReplay** console application.

+

+Recording is a text file.

+Line endings: Unix `'\n'`.

+Character encoding: single-byte (can be ASCII or UTF-8, whaterver you use in custom strings).

+Suggested file extension: **csv**. File can be processed sequentially - no random access is needed.

+Each line forms a separate entry.

+Each line consists of a set of values (also called columns), separated by comma `','` (hence "CSV" format - Comma Separated Values).

+Number of columns is different in different lines.

+

+# Header

+

+First line identifies file format. It must always be:

+

+    Vulkan Memory Allocator,Calls recording

+

+Second line identifies format version, where first column is major version and second column is minor version.

+Formats with only minor version incremented are backward compatible.

+VmaReplay application supports all older versions.

+Current version is:

+

+    1,3

+

+# Configuration

+

+Header is followed by mandatory configuration section (min format version 1.3). It starts with line:

+

+    Config,Begin

+

+And ends with line:

+

+    Config,End

+

+Between them there can be zero or more lines with configuration options. They store values of various variables from the current environment from the time of recording, like properties and limits of Vulkan physical device, available memory heaps and types, enabled Vulkan extensions, as well macros that configure VMA internals. Supported configuration options are:

+

+    PhysicalDevice,apiVersion,<uint32>

+    PhysicalDevice,driverVersion,<uint32>

+    PhysicalDevice,vendorID,<uint32>

+    PhysicalDevice,deviceID,<uint32>

+    PhysicalDevice,deviceType,<uint32>

+    PhysicalDevice,deviceName,<string>

+    

+    PhysicalDeviceLimits,maxMemoryAllocationCount,<uint32>

+    PhysicalDeviceLimits,bufferImageGranularity,<uint64>

+    PhysicalDeviceLimits,nonCoherentAtomSize,<uint64>

+    

+    PhysicalDeviceMemory,HeapCount,<uint32>

+    PhysicalDeviceMemory,Heap,<index:uint32>,size,<uint64>

+    PhysicalDeviceMemory,Heap,<index:uint32>,flags,<uint32>

+    PhysicalDeviceMemory,TypeCount,<uint32>

+    PhysicalDeviceMemory,Type,<index:uint32>,heapIndex,<uint32>

+    PhysicalDeviceMemory,Type,<index:uint32>,propertyFlags,<uint32>

+    

+    Extension,VK_KHR_dedicated_allocation,<bool>

+    

+    Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,<bool>

+    Macro,VMA_DEBUG_ALIGNMENT,<uint64>

+    Macro,VMA_DEBUG_MARGIN,<uint64>

+    Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,<bool>

+    Macro,VMA_DEBUG_DETECT_CORRUPTION,<bool>

+    Macro,VMA_DEBUG_GLOBAL_MUTEX,<bool>

+    Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,<uint64>

+    Macro,VMA_SMALL_HEAP_MAX_SIZE,<uint64>

+    Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,<uint64>

+

+# Function calls

+

+Remaining lines contain recorded calls to VMA functions. First columns are always:

+

+- Thread ID : uint32

+- Time since first call : float, in seconds

+- VMA frame index : uint32

+- Function name : string

+

+Remaining columns are function parameters and output, depending on function name, which can be:

+

+**vmaCreateAllocator, vmaDestroyAllocator**

+

+No parameters.

+

+**vmaCreatePool**

+

+- memoryTypeIndex : uint32

+- flags : uint32

+- blockSize : uint64

+- minBlockCount : uint64

+- maxBlockCount : uint64

+- frameInUseCount : uint32

+- pool (output) : pointer

+

+**vmaDestroyPool**

+

+- pool : pointer

+

+**vmaSetAllocationUserData**

+

+- allocation : pointer

+- pUserData : string (may contain additional commas)

+

+**vmaCreateBuffer**

+

+- bufferCreateInfo.flags : uint32

+- bufferCreateInfo.size : uint64

+- bufferCreateInfo.usage : uint32

+- bufferCreateInfo.sharingMode : uint32

+- allocationCreateInfo.flags : uint32

+- allocationCreateInfo.usage : uint32

+- allocationCreateInfo.requiredFlags : uint32

+- allocationCreateInfo.preferredFlags : uint32

+- allocationCreateInfo.memoryTypeBits : uint32

+- allocationCreateInfo.pool : pointer

+- allocation (output) : pointer

+- allocationCreateInfo.pUserData : string (may contain additional commas)

+

+**vmaDestroyBuffer**

+

+- allocation : pointer

+

+**vmaCreateImage**

+

+- imageCreateInfo.flags : uint32

+- imageCreateInfo.imageType : uint32

+- imageCreateInfo.format : uint32

+- imageCreateInfo.extent.width : uint32

+- imageCreateInfo.extent.height : uint32

+- imageCreateInfo.extent.depth : uint32

+- imageCreateInfo.mipLevels : uint32

+- imageCreateInfo.arrayLayers : uint32

+- imageCreateInfo.samples : uint32

+- imageCreateInfo.tiling : uint32

+- imageCreateInfo.usage : uint32

+- imageCreateInfo.sharingMode : uint32

+- imageCreateInfo.initialLayout : uint32

+- allocationCreateInfo.flags : uint32

+- allocationCreateInfo.usage : uint32

+- allocationCreateInfo.requiredFlags : uint32

+- allocationCreateInfo.preferredFlags : uint32

+- allocationCreateInfo.memoryTypeBits : uint32

+- allocationCreateInfo.pool : pointer

+- allocation (output) : pointer

+- allocationCreateInfo.pUserData : string (may contain additional commas)

+

+**vmaDestroyImage**

+

+- allocation : pointer

+

+**vmaFreeMemory** (min format version 1.1)

+

+- allocation : pointer

+

+**vmaCreateLostAllocation** (min format version 1.2)

+

+- allocation (output) : pointer

+

+**vmaAllocateMemory** (min format version 1.2)

+

+- vkMemoryRequirements.size : uint64

+- vkMemoryRequirements.alignment : uint64

+- vkMemoryRequirements.memoryTypeBits : uint32

+- allocationCreateInfo.flags : uint32

+- allocationCreateInfo.usage : uint32

+- allocationCreateInfo.requiredFlags : uint32

+- allocationCreateInfo.preferredFlags : uint32

+- allocationCreateInfo.memoryTypeBits : uint32

+- allocationCreateInfo.pool : pointer

+- allocation (output) : pointer

+- allocationCreateInfo.pUserData : string (may contain additional commas)

+

+**vmaAllocateMemoryForBuffer, vmaAllocateMemoryForImage** (min format version 1.2)

+

+- vkMemoryRequirements.size : uint64

+- vkMemoryRequirements.alignment : uint64

+- vkMemoryRequirements.memoryTypeBits : uint32

+- requiresDedicatedAllocation : bool

+- prefersDedicatedAllocation : bool

+- allocationCreateInfo.flags : uint32

+- allocationCreateInfo.usage : uint32

+- allocationCreateInfo.requiredFlags : uint32

+- allocationCreateInfo.preferredFlags : uint32

+- allocationCreateInfo.memoryTypeBits : uint32

+- allocationCreateInfo.pool : pointer

+- allocation (output) : pointer

+- allocationCreateInfo.pUserData : string (may contain additional commas)

+

+**vmaMapMemory, vmaUnmapMemory** (min format version 1.2)

+

+- allocation : pointer

+

+**vmaFlushAllocation, vmaInvalidateAllocation** (min format version 1.2)

+

+- allocation : pointer

+- offset : uint64

+- size : uint64

+

+**vmaTouchAllocation, vmaGetAllocationInfo** (min format version 1.2)

+

+- allocation : pointer

+

+**vmaMakePoolAllocationsLost** (min format version: 1.2)

+

+- pool : pointer

+

+# Data types

+

+**bool**

+

+Encoded as `0` for false or `1` for true.

+

+**uint32, uint64**

+

+Encoded in decimal format.

+

+**pointer**

+

+Encoded in hexadecimal format.

+

+**pUserData**

+

+If `pUserData` was a pointer, it is encoded as hexadecimal string.

+If `VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT` was used with the allocation, the string is written as-is.

+It may contain additional commas.

+It should not contain end-of-line characters - results are then undefined.

+

+# Example file

+

+    Vulkan Memory Allocator,Calls recording

+    1,3

+    Config,Begin

+    PhysicalDevice,apiVersion,4198477

+    PhysicalDevice,driverVersion,8388653

+    PhysicalDevice,vendorID,4098

+    PhysicalDevice,deviceID,26751

+    PhysicalDevice,deviceType,2

+    PhysicalDevice,deviceName,Radeon RX Vega

+    PhysicalDeviceLimits,maxMemoryAllocationCount,4096

+    PhysicalDeviceLimits,bufferImageGranularity,1

+    PhysicalDeviceLimits,nonCoherentAtomSize,128

+    PhysicalDeviceMemory,HeapCount,3

+    PhysicalDeviceMemory,Heap,0,size,8304721920

+    PhysicalDeviceMemory,Heap,0,flags,3

+    PhysicalDeviceMemory,Heap,1,size,8286175232

+    PhysicalDeviceMemory,Heap,1,flags,0

+    PhysicalDeviceMemory,Heap,2,size,268435456

+    PhysicalDeviceMemory,Heap,2,flags,3

+    PhysicalDeviceMemory,TypeCount,4

+    PhysicalDeviceMemory,Type,0,heapIndex,0

+    PhysicalDeviceMemory,Type,0,propertyFlags,1

+    PhysicalDeviceMemory,Type,1,heapIndex,1

+    PhysicalDeviceMemory,Type,1,propertyFlags,6

+    PhysicalDeviceMemory,Type,2,heapIndex,2

+    PhysicalDeviceMemory,Type,2,propertyFlags,7

+    PhysicalDeviceMemory,Type,3,heapIndex,1

+    PhysicalDeviceMemory,Type,3,propertyFlags,14

+    Extension,VK_KHR_dedicated_allocation,1

+    Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,0

+    Macro,VMA_DEBUG_ALIGNMENT,1

+    Macro,VMA_DEBUG_MARGIN,0

+    Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,0

+    Macro,VMA_DEBUG_DETECT_CORRUPTION,0

+    Macro,VMA_DEBUG_GLOBAL_MUTEX,0

+    Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,1

+    Macro,VMA_SMALL_HEAP_MAX_SIZE,1073741824

+    Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,268435456

+    Config,End 

+    12552,0.000,0,vmaCreateAllocator

+    12552,0.010,0,vmaCreateImage,0,1,37,128,128,1,1,1,1,1,1,0,8,36,2,0,0,0,0000000000000000,000001D85B8B1A80,

+    12552,0.010,0,vmaSetAllocationUserData,000001D85B8B1A80,Ala ma kota

+    12552,0.015,0,vmaCreateImage,0,1,37,128,128,1,1,1,1,0,6,0,0,0,1,0,0,0,0000000000000000,000001D85B8B1620,

+    12552,0.017,0,vmaDestroyImage,000001D85B8B1A80

+    12552,0.017,0,vmaCreateBuffer,0,768,1,0,4,2,0,0,0,0000000000000000,000001D85B8B19E0,

+    12552,0.017,0,vmaCreateBuffer,0,768,130,0,0,1,0,0,0,0000000000000000,000001D85B8B1A80,

+    12552,0.017,0,vmaCreateBuffer,0,60,1,0,4,2,0,0,0,0000000000000000,000001D85B8B1DA0,

+    12552,0.017,0,vmaCreateBuffer,0,60,66,0,0,1,0,0,0,0000000000000000,000001D85B8B16C0,

+    12552,0.017,0,vmaDestroyBuffer,000001D85B8B1DA0

+    12552,0.017,0,vmaDestroyBuffer,000001D85B8B19E0

+    12552,0.022,0,vmaCreateImage,0,1,126,1424,704,1,1,1,1,0,32,0,0,0,1,0,0,0,0000000000000000,000001D85B8B1EE0,

+    12552,0.048,0,vmaDestroyImage,000001D85B8B1EE0

+    12552,0.053,0,vmaCreateImage,0,1,126,1424,704,1,1,1,1,0,32,0,0,0,1,0,0,0,0000000000000000,000001D85B8B1EE0,

+    12552,0.662,0,vmaDestroyImage,000001D85B8B1EE0

+    12552,0.695,0,vmaDestroyImage,000001D85B8B1620

+    12552,0.695,0,vmaDestroyBuffer,000001D85B8B16C0

+    12552,0.695,0,vmaDestroyBuffer,000001D85B8B1A80

+    12552,0.695,0,vmaDestroyAllocator
\ No newline at end of file
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
index 18ddbd5..37ef74d 100644
--- a/docs/html/annotated.html
+++ b/docs/html/annotated.html
@@ -75,9 +75,10 @@
 <tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool.html" target="_self">VmaPool</a></td><td class="desc">Represents custom memory pool </td></tr>
 <tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_create_info.html" target="_self">VmaPoolCreateInfo</a></td><td class="desc">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> </td></tr>
 <tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_stats.html" target="_self">VmaPoolStats</a></td><td class="desc">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> </td></tr>
-<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
-<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
-<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_vulkan_functions.html" target="_self">VmaVulkanFunctions</a></td><td class="desc">Pointers to some Vulkan functions - a subset used by the library </td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_record_settings.html" target="_self">VmaRecordSettings</a></td><td class="desc">Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a> </td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_vulkan_functions.html" target="_self">VmaVulkanFunctions</a></td><td class="desc">Pointers to some Vulkan functions - a subset used by the library </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/classes.html b/docs/html/classes.html
index b900f2a..099f7e3 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -65,10 +65,10 @@
 <div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
 <table class="classindex">
 <tr><td rowspan="2" valign="bottom"><a name="letter_v"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;v&#160;&#160;</div></td></tr></table>
-</td><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;&#160;&#160;</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;&#160;&#160;</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;&#160;&#160;</td><td></td></tr>
+</td><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;&#160;&#160;</td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
 <div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
diff --git a/docs/html/functions.html b/docs/html/functions.html
index 0751d69..c8ce62d 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -114,6 +114,7 @@
 : <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo</a>
 , <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo</a>
+, <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings</a>
 </li>
 <li>frameInUseCount
 : <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo</a>
@@ -165,6 +166,9 @@
 <li>pDeviceMemoryCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo</a>
 </li>
+<li>pFilePath
+: <a class="el" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings</a>
+</li>
 <li>pfnAllocate
 : <a class="el" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks</a>
 </li>
@@ -183,6 +187,9 @@
 <li>pool
 : <a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo</a>
 </li>
+<li>pRecordSettings
+: <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo</a>
+</li>
 <li>preferredFlags
 : <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo</a>
 </li>
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html
index 6ee6243..de9e9a0 100644
--- a/docs/html/functions_vars.html
+++ b/docs/html/functions_vars.html
@@ -114,6 +114,7 @@
 : <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo</a>
 , <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo</a>
+, <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings</a>
 </li>
 <li>frameInUseCount
 : <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo</a>
@@ -165,6 +166,9 @@
 <li>pDeviceMemoryCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo</a>
 </li>
+<li>pFilePath
+: <a class="el" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings</a>
+</li>
 <li>pfnAllocate
 : <a class="el" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks</a>
 </li>
@@ -183,6 +187,9 @@
 <li>pool
 : <a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo</a>
 </li>
+<li>pRecordSettings
+: <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo</a>
+</li>
 <li>preferredFlags
 : <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo</a>
 </li>
diff --git a/docs/html/general_considerations.html b/docs/html/general_considerations.html
index 5d4362d..f631ac8 100644
--- a/docs/html/general_considerations.html
+++ b/docs/html/general_considerations.html
@@ -74,6 +74,23 @@
 <li>When the allocator is created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d" title="Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> flag, calls to functions that take such <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> object must be synchronized externally.</li>
 <li>Access to a <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> from different threads at the same time if you pass the same <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> object to these functions.</li>
 </ul>
+<h1><a class="anchor" id="general_considerations_validation_layer_warnings"></a>
+Validation layer warnings</h1>
+<p>When using this library, you can meet following types of warnings issued by Vulkan validation layer. They don't necessarily indicate a bug, so you may need to just ignore them.</p>
+<ul>
+<li><em>vkBindBufferMemory(): Binding memory to buffer 0xeb8e4 but vkGetBufferMemoryRequirements() has not been called on that buffer.</em><ul>
+<li>It happens when VK_KHR_dedicated_allocation extension is enabled. <code>vkGetBufferMemoryRequirements2KHR</code> function is used instead, while validation layer seems to be unaware of it.</li>
+</ul>
+</li>
+<li><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><ul>
+<li>It happens when you map a buffer or image, 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.</li>
+</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>
+</ul>
+</li>
+</ul>
 <h1><a class="anchor" id="general_considerations_allocation_algorithm"></a>
 Allocation algorithm</h1>
 <p>The library uses following algorithm for allocation, in order:</p>
@@ -90,7 +107,7 @@
 Features not supported</h1>
 <p>Features deliberately excluded from the scope of this library:</p>
 <ul>
-<li>Data transfer - issuing commands that transfer data between buffers or images, any usage of <code>VkCommandList</code> or <code>VkCommandQueue</code> and related synchronization is responsibility of the user.</li>
+<li>Data transfer - issuing commands that transfer data between buffers or images, any usage of <code>VkCommandList</code> or <code>VkQueue</code> and related synchronization is responsibility of the user.</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>Support for any programming languages other than C/C++. Bindings to other languages are welcomed as external projects. </li>
 </ul>
diff --git a/docs/html/globals.html b/docs/html/globals.html
index 08a3076..2f1f2fb 100644
--- a/docs/html/globals.html
+++ b/docs/html/globals.html
@@ -128,6 +128,15 @@
 <li>VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">vk_mem_alloc.h</a>
 </li>
+<li>VMA_RECORD_FLAG_BITS_MAX_ENUM
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">vk_mem_alloc.h</a>
+</li>
+<li>VMA_RECORD_FLUSH_AFTER_CALL_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">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>
 <li>VMA_STATS_STRING_ENABLED
 : <a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">vk_mem_alloc.h</a>
 </li>
@@ -275,6 +284,15 @@
 <li>VmaPoolStats
 : <a class="el" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">vk_mem_alloc.h</a>
 </li>
+<li>VmaRecordFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">vk_mem_alloc.h</a>
+</li>
+<li>VmaRecordFlags
+: <a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">vk_mem_alloc.h</a>
+</li>
+<li>VmaRecordSettings
+: <a class="el" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">vk_mem_alloc.h</a>
+</li>
 <li>vmaSetAllocationUserData()
 : <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_defs.html b/docs/html/globals_defs.html
index aa8115b..ca5de3f 100644
--- a/docs/html/globals_defs.html
+++ b/docs/html/globals_defs.html
@@ -62,6 +62,9 @@
 <li>VMA_DEDICATED_ALLOCATION
 : <a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">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>
 <li>VMA_STATS_STRING_ENABLED
 : <a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html
index 1df06f1..d295ccd 100644
--- a/docs/html/globals_enum.html
+++ b/docs/html/globals_enum.html
@@ -71,6 +71,9 @@
 <li>VmaPoolCreateFlagBits
 : <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">vk_mem_alloc.h</a>
 </li>
+<li>VmaRecordFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">vk_mem_alloc.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html
index 2035414..091f76b 100644
--- a/docs/html/globals_eval.html
+++ b/docs/html/globals_eval.html
@@ -113,6 +113,12 @@
 <li>VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">vk_mem_alloc.h</a>
 </li>
+<li>VMA_RECORD_FLAG_BITS_MAX_ENUM
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">vk_mem_alloc.h</a>
+</li>
+<li>VMA_RECORD_FLUSH_AFTER_CALL_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">vk_mem_alloc.h</a>
+</li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/globals_type.html b/docs/html/globals_type.html
index 0b3156b..68106a1 100644
--- a/docs/html/globals_type.html
+++ b/docs/html/globals_type.html
@@ -110,6 +110,15 @@
 <li>VmaPoolStats
 : <a class="el" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">vk_mem_alloc.h</a>
 </li>
+<li>VmaRecordFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4">vk_mem_alloc.h</a>
+</li>
+<li>VmaRecordFlags
+: <a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">vk_mem_alloc.h</a>
+</li>
+<li>VmaRecordSettings
+: <a class="el" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">vk_mem_alloc.h</a>
+</li>
 <li>VmaStatInfo
 : <a class="el" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/index.html b/docs/html/index.html
index e4dc71d..dc62c22 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -112,6 +112,7 @@
 <li><a class="el" href="debugging_memory_usage.html#debugging_memory_usage_corruption_detection">Corruption detection</a></li>
 </ul>
 </li>
+<li><a class="el" href="record_and_replay.html">Record and replay</a></li>
 </ul>
 </li>
 <li><a class="el" href="usage_patterns.html">Recommended usage patterns</a><ul>
diff --git a/docs/html/memory_mapping.html b/docs/html/memory_mapping.html
index fa97ad7..7e2c263 100644
--- a/docs/html/memory_mapping.html
+++ b/docs/html/memory_mapping.html
@@ -69,8 +69,11 @@
 <div class="textblock"><p>To "map memory" in Vulkan means to obtain a CPU pointer to <code>VkDeviceMemory</code>, to be able to read from it or write to it in CPU code. Mapping is possible only of memory allocated from a memory type that has <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag. Functions <code>vkMapMemory()</code>, <code>vkUnmapMemory()</code> are designed for this purpose. You can use them directly with memory allocated by this library, but it is not recommended because of following issue: Mapping the same <code>VkDeviceMemory</code> block multiple times is illegal - only one mapping at a time is allowed. This includes mapping disjoint regions. Mapping is not reference-counted internally by Vulkan. Because of this, Vulkan Memory Allocator provides following facilities:</p>
 <h1><a class="anchor" id="memory_mapping_mapping_functions"></a>
 Mapping functions</h1>
-<p>The library provides following functions for mapping of a specific <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. They way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> function. Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div><div class="line"></div><div class="line"><span class="keyword">struct </span>ConstantBuffer</div><div class="line">{</div><div class="line">    ...</div><div class="line">};</div><div class="line">ConstantBuffer constantBufferData;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">VmaBuffer constantBuffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> constantBufferAllocation;</div><div class="line"></div><div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div><div class="line"></div><div class="line"><span class="keywordtype">void</span>* mappedData;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div><div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div></div><!-- fragment --><h1><a class="anchor" id="memory_mapping_persistently_mapped_memory"></a>
+<p>The library provides following functions for mapping of a specific <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. The way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> function. Example:</p>
+<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div><div class="line"></div><div class="line"><span class="keyword">struct </span>ConstantBuffer</div><div class="line">{</div><div class="line">    ...</div><div class="line">};</div><div class="line">ConstantBuffer constantBufferData;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">VkBuffer constantBuffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> constantBufferAllocation;</div><div class="line"></div><div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div><div class="line"></div><div class="line"><span class="keywordtype">void</span>* mappedData;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div><div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div></div><!-- fragment --><p>When mapping, you may see a warning from Vulkan validation layer similar to this one:</p>
+<p><em>Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used.</em></p>
+<p>It happens because the library maps entire <code>VkDeviceMemory</code> block, where different types of images and buffers may end up together, especially on GPUs with unified memory like Intel. You can safely ignore it if you are sure you access only memory of the intended object that you wanted to map.</p>
+<h1><a class="anchor" id="memory_mapping_persistently_mapped_memory"></a>
 Persistently mapped memory</h1>
 <p>Kepping your memory persistently mapped is generally OK in Vulkan. You don't need to unmap it before using its data on the GPU. The library provides a special feature designed for that: Allocations made with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag set in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a> stay mapped all the time, so you can just access CPU pointer to it any time without a need to call any "map" or "unmap" function. Example:</p>
 <div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div></div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
diff --git a/docs/html/record_and_replay.html b/docs/html/record_and_replay.html
new file mode 100644
index 0000000..d4484be
--- /dev/null
+++ b/docs/html/record_and_replay.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Record and replay</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Record and replay </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="record_and_replay_introduction"></a>
+Introduction</h1>
+<p>While using the library, sequence of calls to its functions together with their parameters can be recorded to a file and later replayed using standalone player application. It can be useful to:</p>
+<ul>
+<li>Test correctness - check if same sequence of calls will not cause crash or failures on a target platform.</li>
+<li>Gather statistics - see number of allocations, peak memory usage, number of calls etc.</li>
+<li>Benchmark performance - see how much time it takes to replay the whole sequence.</li>
+</ul>
+<h1><a class="anchor" id="record_and_replay_usage"></a>
+Usage</h1>
+<p><b>To record sequence of calls to a file:</b> Fill in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a> member while creating <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> object. File is opened and written during whole lifetime of the allocator.</p>
+<p><b>To replay file:</b> Use VmaReplay - standalone command-line program. Precompiled binary can be found in "bin" directory. Its source can be found in "src/VmaReplay" directory. Its project is generated by Premake. Command line syntax is printed when the program is launched without parameters. Basic usage: </p><pre class="fragment">VmaReplay.exe MyRecording.csv
+</pre><p><b>Documentation of file format</b> can be found in file: "docs/Recording file format.md". It's a human-readable, text file in CSV format (Comma Separated Values).</p>
+<h1><a class="anchor" id="record_and_replay_additional_considerations"></a>
+Additional considerations</h1>
+<ul>
+<li>Replaying file that was recorded on a different GPU (with different parameters like <code>bufferImageGranularity</code>, <code>nonCoherentAtomSize</code>, and especially different set of memory heaps and types) may give different performance and memory usage results, as well as issue some warnings and errors.</li>
+<li>Current implementation of recording in VMA, as well as VmaReplay application, is coded and tested only on Windows. Inclusion of recording code is driven by <code>VMA_RECORDING_ENABLED</code> macro. Support for other platforms should be easy to add. Contributions are welcomed.</li>
+<li>Currently calls to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> function are not recorded. </li>
+</ul>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js
index 7bacfcc..347c9f3 100644
--- a/docs/html/search/all_4.js
+++ b/docs/html/search/all_4.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['flags',['flags',['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
+  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
   ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
 ];
diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js
index 590465a..33e01da 100644
--- a/docs/html/search/all_9.js
+++ b/docs/html/search/all_9.js
@@ -2,6 +2,7 @@
 [
   ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
   ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
   ['pfn_5fvmaallocatedevicememoryfunction',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
   ['pfn_5fvmafreedevicememoryfunction',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]],
   ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
@@ -10,6 +11,7 @@
   ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
   ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
   ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['precordsettings',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
   ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
   ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
   ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js
index f3376c8..f0c993f 100644
--- a/docs/html/search/all_b.js
+++ b/docs/html/search/all_b.js
@@ -1,5 +1,6 @@
 var searchData=
 [
+  ['record_20and_20replay',['Record and replay',['../record_and_replay.html',1,'index']]],
   ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
   ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js
index a80478e..60dbc10 100644
--- a/docs/html/search/all_f.js
+++ b/docs/html/search/all_f.js
@@ -38,6 +38,9 @@
   ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
   ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
   ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
   ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
   ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
   ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
@@ -90,6 +93,9 @@
   ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
   ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
   ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'VmaRecordFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmarecordflags',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'VmaRecordSettings'],['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'VmaRecordSettings():&#160;vk_mem_alloc.h']]],
   ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
   ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
   ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js
index 152fb2b..7fe2da1 100644
--- a/docs/html/search/classes_0.js
+++ b/docs/html/search/classes_0.js
@@ -11,6 +11,7 @@
   ['vmapool',['VmaPool',['../struct_vma_pool.html',1,'']]],
   ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
   ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
+  ['vmarecordsettings',['VmaRecordSettings',['../struct_vma_record_settings.html',1,'']]],
   ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
   ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'']]],
   ['vmavulkanfunctions',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'']]]
diff --git a/docs/html/search/defines_0.js b/docs/html/search/defines_0.js
index 336effe..bf18592 100644
--- a/docs/html/search/defines_0.js
+++ b/docs/html/search/defines_0.js
@@ -1,5 +1,6 @@
 var searchData=
 [
   ['vma_5fdedicated_5fallocation',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5frecording_5fenabled',['VMA_RECORDING_ENABLED',['../vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c',1,'vk_mem_alloc.h']]],
   ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js
index 9bd6e39..c5ed539 100644
--- a/docs/html/search/enums_0.js
+++ b/docs/html/search/enums_0.js
@@ -3,5 +3,6 @@
   ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]],
   ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]],
   ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]]
+  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js
index ea47966..9f462fc 100644
--- a/docs/html/search/enumvalues_0.js
+++ b/docs/html/search/enumvalues_0.js
@@ -17,5 +17,7 @@
   ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
   ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
   ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]]
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflag_5fbits_5fmax_5fenum',['VMA_RECORD_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e',1,'vk_mem_alloc.h']]],
+  ['vma_5frecord_5fflush_5fafter_5fcall_5fbit',['VMA_RECORD_FLUSH_AFTER_CALL_BIT',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7',1,'vk_mem_alloc.h']]]
 ];
diff --git a/docs/html/search/pages_7.js b/docs/html/search/pages_7.js
index 1e4f738..7394f7d 100644
--- a/docs/html/search/pages_7.js
+++ b/docs/html/search/pages_7.js
@@ -1,4 +1,5 @@
 var searchData=
 [
+  ['record_20and_20replay',['Record and replay',['../record_and_replay.html',1,'index']]],
   ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
 ];
diff --git a/docs/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js
index 716f5e3..5d53a90 100644
--- a/docs/html/search/typedefs_1.js
+++ b/docs/html/search/typedefs_1.js
@@ -15,6 +15,9 @@
   ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
   ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'vk_mem_alloc.h']]],
   ['vmapoolstats',['VmaPoolStats',['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'vk_mem_alloc.h']]],
+  ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4',1,'vk_mem_alloc.h']]],
+  ['vmarecordflags',['VmaRecordFlags',['../vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828',1,'vk_mem_alloc.h']]],
+  ['vmarecordsettings',['VmaRecordSettings',['../vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0',1,'vk_mem_alloc.h']]],
   ['vmastatinfo',['VmaStatInfo',['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'vk_mem_alloc.h']]],
   ['vmastats',['VmaStats',['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'vk_mem_alloc.h']]],
   ['vmavulkanfunctions',['VmaVulkanFunctions',['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'vk_mem_alloc.h']]]
diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js
index 7bacfcc..347c9f3 100644
--- a/docs/html/search/variables_3.js
+++ b/docs/html/search/variables_3.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['flags',['flags',['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
+  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
   ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
 ];
diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js
index 731ce38..46cab85 100644
--- a/docs/html/search/variables_6.js
+++ b/docs/html/search/variables_6.js
@@ -2,12 +2,14 @@
 [
   ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
   ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfilepath',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
   ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
   ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
   ['pheapsizelimit',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
   ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
   ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
   ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['precordsettings',['pRecordSettings',['../struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee',1,'VmaAllocatorCreateInfo']]],
   ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
   ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
   ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
diff --git a/docs/html/struct_vma_allocator_create_info-members.html b/docs/html/struct_vma_allocator_create_info-members.html
index 9340920..598ecde 100644
--- a/docs/html/struct_vma_allocator_create_info-members.html
+++ b/docs/html/struct_vma_allocator_create_info-members.html
@@ -72,8 +72,9 @@
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td><td class="entry"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/struct_vma_allocator_create_info.html b/docs/html/struct_vma_allocator_create_info.html
index 35e8d05..f9735fb 100644
--- a/docs/html/struct_vma_allocator_create_info.html
+++ b/docs/html/struct_vma_allocator_create_info.html
@@ -100,6 +100,9 @@
 <tr class="memitem:a3dc197be3227da7338b1643f70db36bd"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td></tr>
 <tr class="memdesc:a3dc197be3227da7338b1643f70db36bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to Vulkan functions. Can be null if you leave define <code>VMA_STATIC_VULKAN_FUNCTIONS 1</code>.  <a href="#a3dc197be3227da7338b1643f70db36bd">More...</a><br /></td></tr>
 <tr class="separator:a3dc197be3227da7338b1643f70db36bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace2aa4877b16a42b0b7673d4e26000ee"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a></td></tr>
+<tr class="memdesc:ace2aa4877b16a42b0b7673d4e26000ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for recording of VMA calls. Can be null.  <a href="#ace2aa4877b16a42b0b7673d4e26000ee">More...</a><br /></td></tr>
+<tr class="separator:ace2aa4877b16a42b0b7673d4e26000ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Description of a Allocator to be created. </p>
@@ -231,6 +234,23 @@
 
 </div>
 </div>
+<a id="ace2aa4877b16a42b0b7673d4e26000ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ace2aa4877b16a42b0b7673d4e26000ee">&#9670;&nbsp;</a></span>pRecordSettings</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>* VmaAllocatorCreateInfo::pRecordSettings</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Parameters for recording of VMA calls. Can be null. </p>
+<p>If not null, it enables recording of calls to VMA functions to a file. If support for recording is not enabled using <code>VMA_RECORDING_ENABLED</code> macro, creation of the allocator object fails with <code>VK_ERROR_FEATURE_NOT_PRESENT</code>. </p>
+
+</div>
+</div>
 <a id="a8e4714298e3121cdd8b214a1ae7a637a"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a8e4714298e3121cdd8b214a1ae7a637a">&#9670;&nbsp;</a></span>preferredLargeHeapBlockSize</h2>
 
diff --git a/docs/html/struct_vma_record_settings-members.html b/docs/html/struct_vma_record_settings-members.html
new file mode 100644
index 0000000..8079ef8
--- /dev/null
+++ b/docs/html/struct_vma_record_settings-members.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">VmaRecordSettings Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a></td><td class="entry"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a></td><td class="entry"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_record_settings.html b/docs/html/struct_vma_record_settings.html
new file mode 100644
index 0000000..fe9f186
--- /dev/null
+++ b/docs/html/struct_vma_record_settings.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaRecordSettings Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="struct_vma_record_settings-members.html">List of all members</a>  </div>
+  <div class="headertitle">
+<div class="title">VmaRecordSettings Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a>.  
+ <a href="struct_vma_record_settings.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a></td></tr>
+<tr class="memdesc:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for recording. Use <a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4" title="Flags to be used in VmaRecordSettings::flags. ">VmaRecordFlagBits</a> enum.  <a href="#ad8fdcc92119ae7a8c08c1a564c01d63a">More...</a><br /></td></tr>
+<tr class="separator:ad8fdcc92119ae7a8c08c1a564c01d63a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a></td></tr>
+<tr class="memdesc:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Path to the file that should be written by the recording.  <a href="#a6cb1fdbf6bcb610b68f2010dd629e89d">More...</a><br /></td></tr>
+<tr class="separator:a6cb1fdbf6bcb610b68f2010dd629e89d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a>. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="ad8fdcc92119ae7a8c08c1a564c01d63a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad8fdcc92119ae7a8c08c1a564c01d63a">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> VmaRecordSettings::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Flags for recording. Use <a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4" title="Flags to be used in VmaRecordSettings::flags. ">VmaRecordFlagBits</a> enum. </p>
+
+</div>
+</div>
+<a id="a6cb1fdbf6bcb610b68f2010dd629e89d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6cb1fdbf6bcb610b68f2010dd629e89d">&#9670;&nbsp;</a></span>pFilePath</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const char* VmaRecordSettings::pFilePath</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Path to the file that should be written by the recording. </p>
+<p>Suggested extension: "csv". If the file already exists, it will be overwritten. It will be opened for the whole time <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> object is alive. If opening this file fails, creation of the whole allocator object fails. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/vk__mem__alloc_8h.html b/docs/html/vk__mem__alloc_8h.html
index 8a066b6..4c2a48f 100644
--- a/docs/html/vk__mem__alloc_8h.html
+++ b/docs/html/vk__mem__alloc_8h.html
@@ -80,6 +80,9 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to some Vulkan functions - a subset used by the library.  <a href="struct_vma_vulkan_functions.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a>.  <a href="struct_vma_record_settings.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Description of a Allocator to be created.  <a href="struct_vma_allocator_create_info.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -111,6 +114,8 @@
 Macros</h2></td></tr>
 <tr class="memitem:af7b860e63b96d11e44ae8587ba06bbf4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">VMA_DEDICATED_ALLOCATION</a>&#160;&#160;&#160;0</td></tr>
 <tr class="separator:af7b860e63b96d11e44ae8587ba06bbf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f0c126759fc96ccb6e2d23c101d770c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a1f0c126759fc96ccb6e2d23c101d770c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae25f0d55fd91cb166f002b63244800e1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1">VMA_STATS_STRING_ENABLED</a>&#160;&#160;&#160;1</td></tr>
 <tr class="separator:ae25f0d55fd91cb166f002b63244800e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
@@ -133,6 +138,14 @@
 <tr class="memitem:a97064a1a271b0061ebfc3a079862d0c5"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a></td></tr>
 <tr class="memdesc:a97064a1a271b0061ebfc3a079862d0c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to some Vulkan functions - a subset used by the library.  <a href="#a97064a1a271b0061ebfc3a079862d0c5">More...</a><br /></td></tr>
 <tr class="separator:a97064a1a271b0061ebfc3a079862d0c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade20b626a6635ce1bf30ea53dea774e4"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ade20b626a6635ce1bf30ea53dea774e4">VmaRecordFlagBits</a></td></tr>
+<tr class="memdesc:ade20b626a6635ce1bf30ea53dea774e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum. ">VmaRecordSettings::flags</a>.  <a href="#ade20b626a6635ce1bf30ea53dea774e4">More...</a><br /></td></tr>
+<tr class="separator:ade20b626a6635ce1bf30ea53dea774e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3929a1a4547c592fc0b0e55ef452828"><td class="memItemLeft" align="right" valign="top">typedef VkFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></td></tr>
+<tr class="separator:af3929a1a4547c592fc0b0e55ef452828"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a></td></tr>
+<tr class="memdesc:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a>.  <a href="#a0ab61e87ff6365f1d59915eadc37a9f0">More...</a><br /></td></tr>
+<tr class="separator:a0ab61e87ff6365f1d59915eadc37a9f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae0f6d1d733dded220d28134da46b4283"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a></td></tr>
 <tr class="memdesc:ae0f6d1d733dded220d28134da46b4283"><td class="mdescLeft">&#160;</td><td class="mdescRight">Description of a Allocator to be created.  <a href="#ae0f6d1d733dded220d28134da46b4283">More...</a><br /></td></tr>
 <tr class="separator:ae0f6d1d733dded220d28134da46b4283"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -180,6 +193,11 @@
  }<tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>.  <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr>
 </td></tr>
 <tr class="separator:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4dd2c44642312a147a4e93373a6e64d2"><td class="memItemLeft" align="right" valign="top">enum &#160;</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="memdesc:a4dd2c44642312a147a4e93373a6e64d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a" title="Flags for recording. Use VmaRecordFlagBits enum. ">VmaRecordSettings::flags</a>.  <a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">More...</a><br /></td></tr>
+</td></tr>
+<tr class="separator:a4dd2c44642312a147a4e93373a6e64d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa5846affa1e9da3800e3e78fae2305cc"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> { <br />
 &#160;&#160;<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, 
@@ -334,6 +352,20 @@
 
 </div>
 </div>
+<a id="a1f0c126759fc96ccb6e2d23c101d770c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f0c126759fc96ccb6e2d23c101d770c">&#9670;&nbsp;</a></span>VMA_RECORDING_ENABLED</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define VMA_RECORDING_ENABLED&#160;&#160;&#160;0</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <a id="ae25f0d55fd91cb166f002b63244800e1"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae25f0d55fd91cb166f002b63244800e1">&#9670;&nbsp;</a></span>VMA_STATS_STRING_ENABLED</h2>
 
@@ -613,6 +645,52 @@
 
 </div>
 </div>
+<a id="ade20b626a6635ce1bf30ea53dea774e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade20b626a6635ce1bf30ea53dea774e4">&#9670;&nbsp;</a></span>VmaRecordFlagBits</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>  <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>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>. </p>
+
+</div>
+</div>
+<a id="af3929a1a4547c592fc0b0e55ef452828"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3929a1a4547c592fc0b0e55ef452828">&#9670;&nbsp;</a></span>VmaRecordFlags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef VkFlags <a class="el" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0ab61e87ff6365f1d59915eadc37a9f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0ab61e87ff6365f1d59915eadc37a9f0">&#9670;&nbsp;</a></span>VmaRecordSettings</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a>  <a class="el" href="struct_vma_record_settings.html">VmaRecordSettings</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a>. </p>
+
+</div>
+</div>
 <a id="a810b009a788ee8aac72a25b42ffbe31c"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a810b009a788ee8aac72a25b42ffbe31c">&#9670;&nbsp;</a></span>VmaStatInfo</h2>
 
@@ -805,6 +883,28 @@
 
 </div>
 </div>
+<a id="a4dd2c44642312a147a4e93373a6e64d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4dd2c44642312a147a4e93373a6e64d2">&#9670;&nbsp;</a></span>VmaRecordFlagBits</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>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>. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"></a>VMA_RECORD_FLUSH_AFTER_CALL_BIT&#160;</td><td class="fielddoc"><p>Enables flush after recording every function call. </p>
+<p>Enable it if you expect your application to crash, which may leave recording file truncated. It may degrade performance though. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"></a>VMA_RECORD_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+</div>
+</div>
 <h2 class="groupheader">Function Documentation</h2>
 <a id="abf28077dbf82d0908b8acbe8ee8dd9b8"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#abf28077dbf82d0908b8acbe8ee8dd9b8">&#9670;&nbsp;</a></span>vmaAllocateMemory()</h2>
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html
index 8354ec9..ea6d4ef 100644
--- a/docs/html/vk__mem__alloc_8h_source.html
+++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -62,166 +62,176 @@
 <div class="title">vk_mem_alloc.h</div>  </div>
 </div><!--header-->
 <div class="contents">
-<a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment">// in the Software without restriction, including without limitation the rights</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">// copies of the Software, and to permit persons to whom the Software is</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">// furnished to do so, subject to the following conditions:</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">// The above copyright notice and this permission notice shall be included in</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">// all copies or substantial portions of the Software.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment">// THE SOFTWARE.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01190"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1190</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01212"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1212</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;</div><div class="line"><a name="l01225"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1225</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div><div class="line"><a name="l01227"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1227</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l01229"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1229</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;</div><div class="line"><a name="l01233"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1233</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div><div class="line"><a name="l01238"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1238</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div><div class="line"><a name="l01260"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1260</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;</div><div class="line"><a name="l01262"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1262</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01264"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1264</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;</div><div class="line"><a name="l01270"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1270</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div><div class="line"><a name="l01271"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1271</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01272"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1272</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01273"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1273</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01274"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1274</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01275"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1275</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01276"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1276</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01277"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1277</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div><div class="line"><a name="l01278"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1278</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div><div class="line"><a name="l01279"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1279</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01280"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1280</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01281"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1281</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01282"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1282</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01283"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1283</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01284"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1284</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01285"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1285</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01286"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1286</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;</div><div class="line"><a name="l01294"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1294</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;{</div><div class="line"><a name="l01297"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1297</a></span>&#160;    VmaAllocatorCreateFlags <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;</div><div class="line"><a name="l01300"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1300</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;</div><div class="line"><a name="l01303"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1303</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;</div><div class="line"><a name="l01306"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1306</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;</div><div class="line"><a name="l01309"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1309</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;</div><div class="line"><a name="l01312"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1312</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01326"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1326</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01350"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1350</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div><div class="line"><a name="l01362"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1362</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;</div><div class="line"><a name="l01415"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1415</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;{</div><div class="line"><a name="l01418"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1418</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01420"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1420</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01422"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1422</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01424"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1424</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01426"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1426</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01427"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1427</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div><div class="line"><a name="l01428"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1428</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;</div><div class="line"><a name="l01432"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1432</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;{</div><div class="line"><a name="l01434"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1434</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01435"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1435</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01436"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1436</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;</div><div class="line"><a name="l01444"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1444</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01472"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1472</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;{</div><div class="line"><a name="l01477"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1477</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div><div class="line"><a name="l01494"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1494</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div><div class="line"><a name="l01504"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1504</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div><div class="line"><a name="l01511"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1511</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div><div class="line"><a name="l01520"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1520</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div><div class="line"><a name="l01521"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1521</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;</div><div class="line"><a name="l01525"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1525</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div><div class="line"><a name="l01537"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1537</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;</div><div class="line"><a name="l01548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1548</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div><div class="line"><a name="l01561"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1561</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div><div class="line"><a name="l01574"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1574</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div><div class="line"><a name="l01581"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1581</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div><div class="line"><a name="l01587"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1587</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;</div><div class="line"><a name="l01589"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1589</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01591"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1591</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;</div><div class="line"><a name="l01593"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1593</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;{</div><div class="line"><a name="l01596"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1596</a></span>&#160;    VmaAllocationCreateFlags <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01602"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1602</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div><div class="line"><a name="l01607"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1607</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l01612"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 1612</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l01620"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 1620</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l01626"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 1626</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div><div class="line"><a name="l01633"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 1633</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;</div><div class="line"><a name="l01695"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 1695</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div><div class="line"><a name="l01713"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 1713</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;</div><div class="line"><a name="l01715"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 1715</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l01717"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 1717</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;</div><div class="line"><a name="l01721"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 1721</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div><div class="line"><a name="l01724"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 1724</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l01727"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 1727</a></span>&#160;    VmaPoolCreateFlags <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l01732"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 1732</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l01737"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 1737</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div><div class="line"><a name="l01745"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 1745</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div><div class="line"><a name="l01759"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 1759</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;</div><div class="line"><a name="l01764"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 1764</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div><div class="line"><a name="l01767"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 1767</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l01770"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 1770</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l01773"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 1773</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div><div class="line"><a name="l01776"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 1776</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l01783"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 1783</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;</div><div class="line"><a name="l01869"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 1869</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l01874"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 1874</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l01883"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 1883</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l01888"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 1888</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l01893"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 1893</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l01902"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 1902</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div><div class="line"><a name="l01907"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 1907</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;    VkImage image,</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits);</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;</div><div class="line"><a name="l02118"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 2118</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div><div class="line"><a name="l02123"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 2123</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l02128"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 2128</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;</div><div class="line"><a name="l02132"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 2132</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div><div class="line"><a name="l02134"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 2134</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l02136"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 2136</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l02138"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 2138</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l02140"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 2140</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;    VkImage image);</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;    VkImage image,</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;}</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;<span class="comment">Define to 0 if you are going to provide you own pointers to Vulkan functions via</span></div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;<span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;<span class="preprocessor">#if defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;{</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;    {</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;    }</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;}</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;    {</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, static_cast&lt;unsigned int&gt;(num));</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;    }</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;    {</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, static_cast&lt;unsigned long long&gt;(num));</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;    }</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;    {</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;    }</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;    <span class="keyword">class </span>VmaMutex</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;    {</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;        VmaMutex() { }</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;        ~VmaMutex() { }</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;        std::mutex m_Mutex;</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;    };</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic:</span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;<span class="preprocessor">#ifndef VMA_BEST_FIT</span></div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;<span class="preprocessor">    #define VMA_BEST_FIT (1)</span></div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;<span class="preprocessor">        private: \</span></div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;{</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;}</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;{</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;}</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;{</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;    <span class="keywordflow">return</span> val / align * align;</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;}</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;<span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;{</div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;}</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;{</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;    {</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160;        {</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;            {</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;            }</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;            ++insertIndex;</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;        }</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;    }</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;    {</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;    }</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;}</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160;{</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;    {</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160;    }</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160;}</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;    VkDeviceSize pageSize)</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;{</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;}</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;{</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;};</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;    VmaSuballocationType suballocType2)</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;{</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;    {</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;    }</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;    </div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;    {</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;    }</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;}</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;{</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;    {</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;    }</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;}</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;<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="l02812"></a><span class="lineno"> 2812</span>&#160;{</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;    <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;    {</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;        {</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;        }</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;    }</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;}</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;<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="l02826"></a><span class="lineno"> 2826</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;{</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLock)</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    {</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;        {</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;            m_pMutex-&gt;Lock();</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;        }</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    }</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;    </div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;    ~VmaMutexLock()</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;    {</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;        {</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;            m_pMutex-&gt;Unlock();</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;        }</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;    }</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;};</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> CmpT&gt;</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpT cmp)</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;{</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;    <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;    {</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;        {</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;            down = mid + 1;</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;        }</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;        {</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;            up = mid;</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;        }</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;    }</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;    <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;}</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;<span class="comment">// Memory allocation</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;{</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;    {</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;            size,</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;            alignment,</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;    }</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;    {</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;    }</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;}</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;{</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;    {</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;    }</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;    {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;    }</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;}</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;{</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;}</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;{</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;}</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;{</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;}</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;<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="l02947"></a><span class="lineno"> 2947</span>&#160;{</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    {</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;        {</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;        }</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;    }</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;}</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;{</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    </div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;    }</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;    }</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;};</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;{</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;}</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;{</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;    vec.erase(vec.begin() + index);</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;}</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160;{</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;        m_Count(0),</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;        m_Capacity(0)</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;    {</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;    }</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;        m_Count(count),</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;        m_Capacity(count)</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;    {</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;    }</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;    </div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;    {</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;        {</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;        }</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;    }</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;    </div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;    ~VmaVector()</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    {</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;    }</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;    {</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;        {</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;            resize(rhs.m_Count);</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;            {</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;            }</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;        }</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;    }</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;    </div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;    </div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;    {</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    }</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;    }</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;    T&amp; front()</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;    {</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;    }</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;    }</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;    T&amp; back()</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;    {</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;    }</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;    }</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;    <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;    {</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;        </div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;        {</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;            newCapacity = m_Capacity;</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;        }</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;        </div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;        {</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;            {</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;            }</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;        }</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;    }</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;    {</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;        {</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;        }</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;        {</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;            newCapacity = newCount;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;        }</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;        {</div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;            {</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;            }</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;        }</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;    }</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;    {</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;    }</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;    {</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;        {</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;        }</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;        m_pArray[index] = src;</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;    }</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;    <span class="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;    {</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;        {</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;        }</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;        resize(oldCount - 1);</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;    }</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;    {</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;        m_pArray[newIndex] = src;</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;    }</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;    <span class="keywordtype">void</span> pop_back()</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;    {</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;        resize(size() - 1);</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;    }</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;    {</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;        insert(0, src);</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;    }</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;    {</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;        <span class="keyword">remove</span>(0);</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;    }</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;    T* m_pArray;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;};</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;{</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;}</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;{</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;    vec.remove(index);</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;}</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;{</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;        vector.data(),</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;        value,</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;}</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;{</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;        vector.begin(),</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;        vector.end(),</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;        value,</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;        comparator);</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;    {</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;    }</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;}</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;<span class="keywordtype">size_t</span> VmaVectorFindSorted(<span class="keyword">const</span> VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;{</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;        vector.data(),</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;        value,</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;        comparator);</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;    <span class="keywordflow">if</span>(it != vector.size() &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;    {</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;        <span class="keywordflow">return</span> it - vector.begin();</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;    }</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;    {</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;        <span class="keywordflow">return</span> vector.size();</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;    }</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;}</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;{</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;    T* Alloc();</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;    <span class="keyword">union </span>Item</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;    {</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;        uint32_t NextFreeIndex;</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;        T Value;</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    };</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;    <span class="keyword">struct </span>ItemBlock</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;    {</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;        Item* pItems;</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;        uint32_t FirstFreeIndex;</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;    };</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;    </div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;};</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock) :</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;{</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;}</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;{</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;    Clear();</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;}</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;{</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;}</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;{</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;    {</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;        {</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;        }</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;    }</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;}</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;{</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_ItemBlocks.size(); ++i)</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    {</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;        </div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;        </div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + m_ItemsPerBlock))</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;        {</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;        }</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;    }</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;}</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;{</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;    ItemBlock newBlock = {</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;    m_ItemBlocks.push_back(newBlock);</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;}</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;{</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;    T Value;</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;};</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;<span class="keyword">class </span>VmaRawList</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;{</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;    VMA_CLASS_NO_COPY(VmaRawList)</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;    <span class="keywordtype">void</span> PopFront();</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;    </div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;};</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;    m_Count(0)</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;{</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;}</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;{</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;}</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;{</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;    {</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160;        {</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;            pItem = pPrevItem;</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;        }</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;        m_pFront = VMA_NULL;</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;        m_Count = 0;</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;    }</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;}</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;{</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160;    {</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;    }</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;    {</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;        ++m_Count;</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;    }</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;}</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;{</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;    {</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;    }</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;    {</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;        ++m_Count;</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;    }</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;}</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;{</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;}</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160;</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;{</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;}</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;{</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>&#160;    {</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;    }</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;    --m_Count;</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;}</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;{</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;    {</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;    }</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;    m_pFront = pNextItem;</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>&#160;    --m_Count;</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;}</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;{</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;    {</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;    }</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;    {</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;    }</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;    {</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;    }</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;    {</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;    }</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;    --m_Count;</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;}</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;{</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;    {</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;        {</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;            prevItem-&gt;pNext = newItem;</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;        }</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;        {</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;        }</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;        ++m_Count;</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;    }</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;}</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;{</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;    {</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;        {</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;        }</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;        {</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;        }</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;        ++m_Count;</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;    }</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;        <span class="keywordflow">return</span> PushFront();</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;}</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;{</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;}</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;{</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;}</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;<span class="keyword">class </span>VmaList</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;{</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;    VMA_CLASS_NO_COPY(VmaList)</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;    {</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;        iterator() :</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;        {</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;        }</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;        }</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;        }</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;        iterator&amp; operator++()</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;        {</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;        }</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;        iterator&amp; operator--()</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;        {</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;            {</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;            }</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;            {</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;            }</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160;        }</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;        {</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;        }</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;        {</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;        }</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;        }</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;        }</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;        </div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;        {</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;        }</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;    };</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;    <span class="keyword">class </span>const_iterator</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160;    {</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;        const_iterator() :</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;        {</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;        }</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;        {</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;        }</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;        </div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;        }</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;        }</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;        const_iterator&amp; operator++()</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;        {</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;        }</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;        const_iterator&amp; operator--()</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;        {</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;            {</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;            }</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;            {</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;            }</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160;        }</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;        {</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;        }</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;        {</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;        }</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;        }</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;        }</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;        </div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;        {</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;        }</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;    };</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;    <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="l03849"></a><span class="lineno"> 3849</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;};</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;<span class="comment">// class VmaMap</span></div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;<span class="comment">// Unused in this version.</span></div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;{</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;    T1 first;</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;    T2 second;</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;    VmaPair() : first(), second() { }</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;};</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;{</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;    </div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;};</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;{</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;    }</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;    }</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;};</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;{</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;        pair,</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;}</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;{</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;        key,</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;    {</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;    }</div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160;    {</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;    }</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;}</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;{</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;}</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>&#160;{</div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocation_T)</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;    {</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;    };</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;    {</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;    };</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;        m_Size(0),</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;    {</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;        m_BufferImageUsage = 0;</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;    }</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;    ~VmaAllocation_T()</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;    {</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;    }</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;    {</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;        m_Size = size;</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;    }</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;    {</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;    }</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;        VkDeviceSize offset);</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;        VkDeviceSize size)</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;    {</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;        m_Size = size;</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;    }</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;    <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;    }</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetPool() <span class="keyword">const</span>;</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;    </div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;    }</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;    {</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;    }</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;    {</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;    }</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;    VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;</div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;    {</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;        VMA_ASSERT(m_BufferImageUsage == 0);</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;    }</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;    {</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hPool; <span class="comment">// Null if belongs to general memory.</span></div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;    };</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;    {</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;    };</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160;</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;    <span class="keyword">union</span></div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;    {</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;    };</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;    uint32_t m_CreationFrameIndex;</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;};</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;{</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;};</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160;</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;{</div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;    }</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;};</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;{</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata)</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;    ~VmaBlockMetadata();</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;    <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;    <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;    VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;    VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;    <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;    <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;</div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;    uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;    VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;    <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;};</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;{</div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;    VmaBlockMetadata m_Metadata;</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;    ~VmaDeviceMemoryBlock()</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;    {</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;        VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;    }</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;</div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;        VkDeviceSize newSize,</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;        uint32_t <span class="keywordtype">id</span>);</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;    <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;    </div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;</div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;        VkBuffer hBuffer);</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;        VkImage hImage);</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160;</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;    VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;    <span class="comment">// Protects access to m_hMemory so it&#39;s not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    <span class="comment">// Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;};</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;<span class="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;{</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;    <span class="keywordtype">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="l04408"></a><span class="lineno"> 4408</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;    }</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;};</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;{</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVector)</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;        <span class="keywordtype">bool</span> isCustomPool);</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;    ~VmaBlockVector();</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;    VkResult CreateMinBlocks();</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.empty(); }</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;    VkResult Allocate(</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;    <span class="keywordtype">void</span> Free(</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;    VkResult CheckCorruption();</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;        uint32_t&amp; maxAllocationsToMove);</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;    <span class="keywordtype">void</span> DestroyDefragmentator();</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;    uint32_t m_NextBlockId;</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;};</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;<span class="keyword">struct </span>VmaPool_T</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;{</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;    VmaBlockVector m_BlockVector;</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    VmaPool_T(</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo);</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;    ~VmaPool_T();</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;    VmaBlockVector&amp; GetBlockVector() { <span class="keywordflow">return</span> m_BlockVector; }</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;};</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;<span class="keyword">class </span>VmaDefragmentator</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;{</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentator)</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;    {</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;            m_pChanged(VMA_NULL)</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;        {</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        }</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;    };</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;    {</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;        }</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;    };</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;    <span class="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;    {</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;        {</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;        }</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;        {</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_Metadata.GetAllocationCount();</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;        }</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;        {</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;        }</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;        VkResult EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData);</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;        <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;    };</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;    {</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;        <span class="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="l04609"></a><span class="lineno"> 4609</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;        }</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;        <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="l04613"></a><span class="lineno"> 4613</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;        }</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;    };</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    {</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;        <span class="keywordtype">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="l04623"></a><span class="lineno"> 4623</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;            {</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;            }</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;            {</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;            }</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;            {</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;            }</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;        }</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;    };</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;    BlockInfoVector m_Blocks;</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;    VkResult DefragmentRound(</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;    ~VmaDefragmentator();</div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;</div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;};</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;{</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;    </div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;    <span class="comment">// Number of bytes free out of limit, or VK_WHOLE_SIZE if not limit for that heap.</span></div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;    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="l04697"></a><span class="lineno"> 4697</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;    }</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;    }</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;    }</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;    }</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;    }</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;    }</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;    }</div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;        VkImage hImage,</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;    <span class="keywordtype">void</span> FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;        VkBool32* pAllocationsChanged,</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;    <span class="keywordtype">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="l04781"></a><span class="lineno"> 4781</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;    <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;    VkResult BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer);</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;    VkResult BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage);</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;        VMA_CACHE_OPERATION op);</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;    <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="l04812"></a><span class="lineno"> 4812</span>&#160;</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    </div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;    uint32_t m_NextPoolId;</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;    <span class="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="l04827"></a><span class="lineno"> 4827</span>&#160;</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;    <span class="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;};</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;<span class="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="l04861"></a><span class="lineno"> 4861</span>&#160;{</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;}</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;{</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;}</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;{</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;}</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;{</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;}</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;{</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;    {</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;        ptr-&gt;~T();</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;    }</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;}</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;{</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;    {</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    }</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;}</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;<span class="comment">// VmaStringBuilder</span></div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;</div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;{</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;    VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;</div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;};</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;{</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;    {</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;    }</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;}</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;{</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;    Add(buf);</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;}</div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;{</div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;    Add(buf);</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;}</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;{</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;    Add(buf);</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;}</div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;<span class="comment">// VmaJsonWriter</span></div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;{</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;    ~VmaJsonWriter();</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;    </div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;    <span class="keywordtype">void</span> EndArray();</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;    </div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;    </div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;    {</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;        COLLECTION_TYPE_ARRAY,</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;    };</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;    <span class="keyword">struct </span>StackItem</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;    {</div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;        COLLECTION_TYPE type;</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    };</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;};</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;    m_SB(sb),</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;    m_InsideString(false)</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;{</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;}</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;{</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;}</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;{</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;    StackItem item;</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;}</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;{</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;}</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;{</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;    StackItem item;</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;}</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;{</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;}</div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;{</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    EndString();</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;}</div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;{</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;    {</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;    }</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;}</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;{</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;    {</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\&#39;&#39;</span>)</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;        {</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;        }</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;        {</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160;        }</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;        {</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;            m_SB.Add(ch);</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;        }</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;        {</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;        }</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;    }</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;}</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;{</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;}</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;{</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;}</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;{</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;    m_SB.AddPointer(ptr);</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;}</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;{</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;    {</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;    }</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;}</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;{</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;}</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;{</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;}</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;{</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;}</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;{</div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;}</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;{</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;    {</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;            currItem.valueCount % 2 == 0)</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;        {</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;            VMA_ASSERT(isString);</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;        }</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;            currItem.valueCount % 2 != 0)</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;        {</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;        }</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;        {</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;            WriteIndent();</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;        }</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;        {</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;            WriteIndent();</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;        }</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;        ++currItem.valueCount;</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;    }</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;}</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;{</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;    {</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;        m_SB.AddNewLine();</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;        </div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;        {</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;            --count;</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;        }</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;        {</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;            m_SB.Add(INDENT);</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;        }</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;    }</div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;}</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;<span class="keywordtype">void</span> 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="l05251"></a><span class="lineno"> 5251</span>&#160;{</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;    {</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;        {</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrSrc = (<span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;            <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrDst = vma_new_array(hAllocator, <span class="keywordtype">char</span>, newStrLen + 1);</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;        }</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;    }</div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;    {</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;    }</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;}</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;{</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;    {</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;    }</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;}</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;    {</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;    }</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;}</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;</div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;    {</div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;    }</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;}</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;    {</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;    }</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;}</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;    {</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        {</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;        }</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;        {</div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;        }</div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;    }</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;}</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;    {</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;    }</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;}</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;<a class="code" href="struct_vma_pool.html">VmaPool</a> VmaAllocation_T::GetPool()<span class="keyword"> const</span></div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;}</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;{</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;    {</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;        {</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;        }</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;        {</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;        }</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;        {</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;            {</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;                <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="l05407"></a><span class="lineno"> 5407</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;            }</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;        }</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    }</div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;}</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;};</div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;    {</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;        {</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        }</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        {</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;            json.BeginString();</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;            json.EndString();</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;        }</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;    }</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div><div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;    {</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;    }</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;}</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;{</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;    {</div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> oldStr = (<span class="keywordtype">char</span>*)m_pUserData;</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;    }</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;}</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;{</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;    {</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;        ++m_MapCount;</div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;    }</div><div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;    {</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;    }</div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;}</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;{</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;</div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;    {</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;    }</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;    {</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;    }</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;}</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;</div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;{</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;    {</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;        {</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;        }</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;        {</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;        }</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;    }</div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;    {</div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;            ppData);</div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;        {</div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;        }</div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;    }</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;}</div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;</div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;{</div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;    {</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;        {</div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;        }</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;    }</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;    {</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;    }</div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;}</div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;</div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;{</div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;</div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;</div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;    {</div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;        json.EndObject();</div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;    }</div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;</div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;    {</div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;        json.EndObject();</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;    }</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;</div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;    json.EndObject();</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;}</div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;</div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;{</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;    }</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;    }</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;};</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;    m_Size(0),</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;{</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;}</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;VmaBlockMetadata::~VmaBlockMetadata()</div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;{</div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;}</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Init(VkDeviceSize size)</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;{</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;    m_Size = size;</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;    m_FreeCount = 1;</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;    --suballocItem;</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;}</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;    <span class="keywordflow">if</span>(m_Suballocations.empty())</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;    {</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;    }</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;    </div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculates from previous ones.</span></div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;</div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    {</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        </div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;        <span class="keywordflow">if</span>(subAlloc.offset != calculatedOffset)</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        {</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        }</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;        <span class="keywordflow">if</span>(prevFree &amp;&amp; currFree)</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;        {</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;        }</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;        <span class="keywordflow">if</span>(currFree != (subAlloc.hAllocation == VK_NULL_HANDLE))</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;        {</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;        }</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;        <span class="keywordflow">if</span>(currFree)</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;        {</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;            {</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;                ++freeSuballocationsToRegister;</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;            }</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &lt; VMA_DEBUG_MARGIN)</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;            {</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;            }</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;        }</div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;        {</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetOffset() != subAlloc.offset)</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;            {</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;            }</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetSize() != subAlloc.size)</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;            {</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;            }</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; !prevFree)</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;            {</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;            }</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;        }</div><div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;</div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;        prevFree = currFree;</div><div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;    }</div><div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;</div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;    <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.size() != freeSuballocationsToRegister)</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;    {</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;    }</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;    {</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;        </div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;        {</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;        }</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;size &lt; lastSize)</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;        {</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;        }</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;</div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;        lastSize = suballocItem-&gt;size;</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;    }</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;</div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;    <span class="keywordflow">if</span>(!ValidateFreeSuballocationList() ||</div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;        (calculatedOffset != m_Size) ||</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;        (calculatedSumFreeSize != m_SumFreeSize) ||</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;        (calculatedFreeCount != m_FreeCount))</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;    {</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;    }</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;}</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;VkDeviceSize VmaBlockMetadata::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;    {</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;    }</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;    {</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    }</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;}</div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;}</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;    </div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;    {</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;        {</div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;            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="l05823"></a><span class="lineno"> 5823</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;        }</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;        {</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;            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="l05828"></a><span class="lineno"> 5828</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;        }</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;    }</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;}</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;</div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += m_Size;</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;}</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;</div><div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;</div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;</div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;    json.WriteNumber(m_SumFreeSize);</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    json.WriteNumber((uint64_t)m_Suballocations.size() - m_FreeCount);</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;    json.WriteNumber(m_FreeCount);</div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;    json.BeginArray();</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;        ++suballocItem, ++i)</div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;    {</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;        </div><div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;        json.WriteNumber(suballocItem-&gt;offset);</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;</div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;        {</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;            json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;            json.WriteNumber(suballocItem-&gt;size);</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;        }</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        {</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;            suballocItem-&gt;hAllocation-&gt;PrintParameters(json);</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;        }</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;        json.EndObject();</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;    }</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;    json.EndArray();</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;</div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;    json.EndObject();</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;}</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;</div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;<span class="comment">How many suitable free suballocations to analyze before choosing best one.</span></div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;<span class="comment">- Set to 1 to use First-Fit algorithm - first suitable free suballocation will</span></div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;<span class="comment">  be chosen.</span></div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;<span class="comment">- Set to UINT32_MAX to use Best-Fit/Worst-Fit algorithm - all suitable free</span></div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;<span class="comment">  suballocations will be analized and best one will be chosen.</span></div><div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;<span class="comment">- Any other value is also acceptable.</span></div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;<span class="comment">//static const uint32_t MAX_SUITABLE_SUBALLOCATIONS_TO_CHECK = 8;</span></div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CreateAllocationRequest(</div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;{</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;</div><div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp; m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;    {</div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;    }</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;</div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;    {</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;        <span class="keywordflow">if</span>(VMA_BEST_FIT)</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;        {</div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div><div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div><div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;            {</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;                    allocSize,</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;                    allocType,</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;                {</div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;                }</div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;            }</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;        }</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;        {</div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div><div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;            {</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;                    allocSize,</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;                    allocType,</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;                {</div><div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;                }</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;            }</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;        }</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;    }</div><div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;    {</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;</div><div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;            ++suballocIt)</div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;        {</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;            {</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;                    allocSize,</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;                    allocAlignment,</div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;                    allocType,</div><div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;                    suballocIt,</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;                {</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;                    tmpAllocRequest.item = suballocIt;</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;                    {</div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;                    }</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;                }</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;            }</div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;        }</div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;        {</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;        }</div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;    }</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;}</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::MakeRequestedAllocationsLost(</div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;{</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;    {</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;        {</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;            ++pAllocationRequest-&gt;item;</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;        }</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;        {</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;        }</div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;        {</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;        }</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    }</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;    </div><div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;}</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;uint32_t VmaBlockMetadata::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;{</div><div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;        ++it)</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;    {</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;        {</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;            it = FreeSuballocation(it);</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;        }</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;    }</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;}</div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;VkResult VmaBlockMetadata::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;{</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;        ++it)</div><div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;    {</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;        {</div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;            {</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;            }</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;            {</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;            }</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;        }</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;    }</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;}</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Alloc(</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;{</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;    UnregisterFreeSuballocation(request.item);</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;    suballoc.offset = request.offset;</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;    suballoc.hAllocation = hAllocation;</div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;</div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;    <span class="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="l06135"></a><span class="lineno"> 6135</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;    {</div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;        ++next;</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;    }</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;    <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    {</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;    }</div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;    {</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    }</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;    {</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;    }</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;}</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;{</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;    {</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;        {</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;        }</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;    }</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;}</div><div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;</div><div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;{</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;    {</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;        {</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;        }</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;    }</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;}</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;    {</div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;        {</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;        }</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;        {</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;        }</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; lastSize)</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;        {</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;        }</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;        lastSize = it-&gt;size;</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;    }</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;}</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CheckAllocation(</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;    </div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160;    *pSumItemSize = 0;</div><div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;    {</div><div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        {</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        }</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;        {</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;            {</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;            }</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;            {</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;            }</div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;        }</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;        <span class="keywordflow">if</span>(m_Size - suballocItem-&gt;offset &lt; allocSize)</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;        {</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;        }</div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;</div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;    </div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;        {</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;        }</div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;    </div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;        {</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;            {</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;                {</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;                    {</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;                    }</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;                }</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;            }</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;            {</div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;            }</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;        }</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;    </div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;        {</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;        }</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;    </div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; m_Size)</div><div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;        {</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;        }</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;</div><div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;        {</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;            {</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;                ++lastSuballocItem;</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;                {</div><div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;                }</div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;                {</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;                }</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;                {</div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;                    {</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;                    }</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;                    {</div><div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;                    }</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;                }</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;            }</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;        }</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;        {</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;            {</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;                {</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;                    {</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;                        {</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;                        }</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;                        {</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;                        }</div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;                    }</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;                }</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;                {</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;                }</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;            }</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;        }</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;    }</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;    {</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;        {</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;        }</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;        *pOffset = suballoc.offset;</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;    </div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;        {</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;        }</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;    </div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;    </div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;        {</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;            {</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;                {</div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;                    {</div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;                    }</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;                }</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;            }</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;            {</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;            }</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;        }</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;    </div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;        {</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;        }</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;        {</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;            {</div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;                {</div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;                    {</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;                    }</div><div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;                }</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;                {</div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;                }</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;            }</div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;        }</div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;    }</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;</div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;}</div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;{</div><div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;    </div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;    ++nextItem;</div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;}</div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;</div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;{</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;    </div><div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;    </div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;    ++nextItem;</div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;    {</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    }</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;    {</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;        --prevItem;</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;        {</div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div><div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;        }</div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;    }</div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;</div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;    {</div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;        MergeFreeWithNext(suballocItem);</div><div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;    }</div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;</div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;    {</div><div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;    }</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;    {</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;    }</div><div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160;}</div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;{</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;    {</div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;        {</div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;        }</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        {</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div><div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;        }</div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;    }</div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;}</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;</div><div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;{</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;</div><div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;    <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="l06606"></a><span class="lineno"> 6606</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;    {</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;            item,</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;            ++index)</div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;        {</div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;            {</div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;            }</div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;        }</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;    }</div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;}</div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;</div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;</div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;    m_Metadata(hAllocator),</div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;    m_Id(0),</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;{</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;}</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;    VkDeviceSize newSize,</div><div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160;    uint32_t <span class="keywordtype">id</span>)</div><div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160;{</div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;    m_Id = id;</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;</div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;    m_Metadata.Init(newSize);</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;}</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;{</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;    VMA_ASSERT(m_Metadata.IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;    </div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_Metadata.GetSize(), m_hMemory);</div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;}</div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;</div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;    <span class="keywordflow">if</span>((m_hMemory == VK_NULL_HANDLE) ||</div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;        (m_Metadata.GetSize() == 0))</div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;    {</div><div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;    }</div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;    </div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;    <span class="keywordflow">return</span> m_Metadata.Validate();</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;}</div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;</div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;{</div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;    {</div><div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;    }</div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;</div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;    res = m_Metadata.CheckCorruption(pData);</div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;</div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;</div><div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;}</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;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="l06700"></a><span class="lineno"> 6700</span>&#160;{</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    {</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;    }</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;</div><div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;    {</div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;        {</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;        }</div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;    }</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;    {</div><div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;            m_hMemory,</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;        {</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;            {</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;            }</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;        }</div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;    }</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;}</div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;<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="l06739"></a><span class="lineno"> 6739</span>&#160;{</div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;    {</div><div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160;    }</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;</div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;    {</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;        {</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;        }</div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    }</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    {</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;    }</div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;}</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;{</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;    {</div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;    }</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div><div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;</div><div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;</div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;}</div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;{</div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;    {</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;    }</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;    {</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;    }</div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    {</div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;    }</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;}</div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;</div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;    VkBuffer hBuffer)</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;{</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;        hBuffer,</div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;        m_hMemory,</div><div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;}</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;    VkImage hImage)</div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;{</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;        hImage,</div><div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;        m_hMemory,</div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;}</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;{</div><div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;}</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;{</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;}</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;</div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;{</div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;}</div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;</div><div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo) :</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;    m_BlockVector(</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;        hAllocator,</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;        createInfo.blockSize,</div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;        true), <span class="comment">// isCustomPool</span></div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;    m_Id(0)</div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;{</div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;}</div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;</div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;{</div><div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;}</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;</div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;</div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;    <span class="keywordtype">bool</span> isCustomPool) :</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;    m_pDefragmentator(VMA_NULL),</div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;    m_NextBlockId(0)</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;{</div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;}</div><div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;{</div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;    {</div><div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;    }</div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;}</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;</div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;{</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    {</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;        {</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;        }</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;    }</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;}</div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;</div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div><div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;{</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;</div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;    {</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;        pBlock-&gt;m_Metadata.AddPoolStats(*pStats);</div><div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;    }</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;}</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;</div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;}</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;</div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;{</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;    <span class="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;    {</div><div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    }</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;</div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;</div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;    <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;    <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;    {</div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;        VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;        VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;        <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;            currentFrameIndex,</div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;            m_FrameInUseCount,</div><div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;            m_BufferImageGranularity,</div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;            size,</div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;            alignment,</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;            suballocType,</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;            <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;            &amp;currRequest))</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;        {</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;            <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;            VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;            {</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;                VkResult res = pCurrBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;                {</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;                }</div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;            }</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;            </div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;            <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;            <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;            {</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;            }</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;            </div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;            pCurrBlock-&gt;m_Metadata.Alloc(currRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;                hCurrentPool,</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;                pCurrBlock,</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;                currRequest.offset,</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;                alignment,</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;                size,</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;                suballocType,</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;                mapped,</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;            VMA_HEAVY_ASSERT(pCurrBlock-&gt;Validate());</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;            {</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;                m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;            }</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;            {</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;                VkResult res = pCurrBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;                VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;            }</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;        }</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;    }</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;</div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;</div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;    <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;    <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;    {</div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;        <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;        VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;        uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;        <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;        <span class="comment">// Allocating blocks of other sizes is allowed only in default pools.</span></div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;        <span class="comment">// In custom pools block size is fixed.</span></div><div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;        {</div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;            <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;            <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;            {</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;                {</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;                }</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;                {</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;                }</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;            }</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;        }</div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;</div><div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;        <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;        VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;        <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div><div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;        {</div><div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;            <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;            {</div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;                {</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;                    res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;                }</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;                {</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;                }</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;            }</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;        }</div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;        {</div><div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;            VMA_ASSERT(pBlock-&gt;m_Metadata.GetSize() &gt;= size);</div><div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;</div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;            {</div><div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;                res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;                {</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;                }</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;            }</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;            <span class="comment">// Allocate from pBlock. Because it is empty, dstAllocRequest can be trivially filled.</span></div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;            VmaAllocationRequest allocRequest;</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;            <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;                currentFrameIndex,</div><div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;                m_FrameInUseCount,</div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;                m_BufferImageGranularity,</div><div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;                size,</div><div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;                alignment,</div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;                suballocType,</div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;                &amp;allocRequest))</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;            {</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;                *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;                pBlock-&gt;m_Metadata.Alloc(allocRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;                (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;                    pBlock,</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;                    allocRequest.offset,</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;                    alignment,</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;                    size,</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;                    suballocType,</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;                    mapped,</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;                    (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;                VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new allocation Size=%llu&quot;</span>, allocInfo.allocationSize);</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;                (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;                {</div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;                    m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;                }</div><div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;                <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;                {</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;                    res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, allocRequest.offset, size);</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;                    VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;                }</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;            }</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;            {</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;                <span class="comment">// Allocation from empty block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;            }</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;        }</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    }</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;    {</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;        {</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;            <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;            {</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;                VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;                <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;                    m_BufferImageGranularity,</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;                    size,</div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;                    alignment,</div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;                    suballocType,</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;                    &amp;currRequest))</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;                {</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;                    <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;                        currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;                    {</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;                        pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;                        bestRequest = currRequest;</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;                        bestRequestCost = currRequestCost;</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;                        <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;                        {</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;                        }</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;                    }</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;                }</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;            }</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;            {</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;                {</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;                    {</div><div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;                    }</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;                }</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.MakeRequestedAllocationsLost(</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;                {</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;                    {</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;                    }</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;                    pBestRequestBlock-&gt;m_Metadata.Alloc(bestRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;                        alignment,</div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;                        size,</div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;                        suballocType,</div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;                        mapped,</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;                    {</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;                    }</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;                    {</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;                    }</div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;                }</div><div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;            }</div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;            {</div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;            }</div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;        }</div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        {</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;        }</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;    }</div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;}</div><div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;</div><div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;{</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;    {</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;        {</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;        }</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;</div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;        {</div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;        }</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;        pBlock-&gt;m_Metadata.Free(hAllocation);</div><div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;</div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;        {</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;            <span class="comment">// Already has empty Allocation. We don&#39;t want to have two, so delete this one.</span></div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;            {</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;            }</div><div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;            <span class="comment">// We now have first empty block.</span></div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;            {</div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;            }</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;        }</div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;        {</div><div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_Metadata.IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;            {</div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;            }</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;        }</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;    }</div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;</div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;    {</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;    }</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;}</div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;</div><div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;    VkDeviceSize result = 0;</div><div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;    {</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_Metadata.GetSize());</div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;        {</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;        }</div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;    }</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;}</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;{</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;    {</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;        {</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;        }</div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;    }</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;}</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;</div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;{</div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;    <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;    {</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_Metadata.GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;        {</div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;            VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;        }</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;    }</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;}</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;</div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;{</div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;    {</div><div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;    }</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;</div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;</div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;        mem,</div><div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;        allocInfo.allocationSize,</div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;        m_NextBlockId++);</div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;    {</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;    }</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;}</div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;</div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;</div><div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;{</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;    json.BeginObject();</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    {</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;</div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;        {</div><div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;        }</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;        {</div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        }</div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;        json.EndObject();</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;</div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;        {</div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;        }</div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;    }</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;    {</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;    }</div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;</div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;    json.BeginObject();</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;    {</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;        json.BeginString();</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;        json.EndString();</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;        m_Blocks[i]-&gt;m_Metadata.PrintDetailedMap(json);</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;    }</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;    json.EndObject();</div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;    json.EndObject();</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;}</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;{</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;    {</div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;            hAllocator,</div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;    }</div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;}</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;    <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>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;{</div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;    {</div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;    }</div><div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;</div><div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;</div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;    {</div><div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;        <span class="keyword">const</span> VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;        <span class="keyword">const</span> uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;        maxBytesToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;        maxAllocationsToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;    }</div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;    </div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;    {</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;        {</div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;            {</div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;                {</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;                }</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;</div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160;            }</div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;            {</div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;            }</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;        }</div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;    }</div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;</div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;}</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;{</div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;    {</div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;    }</div><div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;}</div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160;</div><div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;{</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;    {</div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;        lostAllocationCount += pBlock-&gt;m_Metadata.MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;    }</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;    {</div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;    }</div><div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;}</div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;{</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;    {</div><div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;    }</div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;</div><div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    {</div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;        {</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;        }</div><div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;    }</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;}</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;</div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;{</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;</div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;    {</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;        pBlock-&gt;m_Metadata.CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;    }</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;}</div><div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;</div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;{</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;}</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;{</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;    {</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;    }</div><div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;}</div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;{</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;}</div><div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;</div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;VkResult VmaDefragmentator::BlockInfo::EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData)</div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;{</div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;    {</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;    }</div><div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;            </div><div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;GetMappedData())</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;    {</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;        *ppMappedData = m_pBlock-&gt;GetMappedData();</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;    }</div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;            </div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;}</div><div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::BlockInfo::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;{</div><div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;    {</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;    }</div><div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;}</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;</div><div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;{</div><div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;    {</div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;    }</div><div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;</div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;    {</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations - they are sorted from largest to smallest.</span></div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;        {</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;            {</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;                {</div><div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;                }</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;                {</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;                }</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;            }</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;            {</div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;            }</div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;        }</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;        </div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;</div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;</div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;        {</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;                size,</div><div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160;                alignment,</div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;                suballocType,</div><div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;            {</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;                {</div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;                }</div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;                {</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;                }</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;                {</div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;                }</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;                </div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;                memcpy(</div><div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;                {</div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset + size);</div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;                }</div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;                </div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.Alloc(dstAllocRequest, suballocType, size, allocInfo.m_hAllocation);</div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_Metadata.FreeAtOffset(srcOffset);</div><div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160;                </div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;                {</div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;                }</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;</div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;            }</div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;        }</div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;</div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;        {</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;        }</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;        {</div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;            {</div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;            }</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;            {</div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;            }</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;        }</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;    }</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;}</div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;</div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;{</div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;    {</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;    }</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;</div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;    {</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;    }</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;</div><div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;    <span class="comment">// Move allocation infos from m_Allocations to appropriate m_Blocks[memTypeIndex].m_Allocations.</span></div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0, allocCount = m_Allocations.size(); blockIndex &lt; allocCount; ++blockIndex)</div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    {</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;        <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;        {</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;            {</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;            }</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;            {</div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;            }</div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;        }</div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;    }</div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;</div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;    {</div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;    }</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;</div><div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> round = 0; (round &lt; 2) &amp;&amp; (result == VK_SUCCESS); ++round)</div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;    {</div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;    }</div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;</div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;    {</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;    }</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;}</div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;</div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;{</div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;    {</div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;    }</div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;    {</div><div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;    }</div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;    {</div><div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;    }</div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;}</div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;</div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;</div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;    m_NextPoolId(0)</div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;{</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;    {</div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;    }</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;</div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);</div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;</div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0)</div><div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;    {</div><div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;    }</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;        </div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;    {</div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;    }</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;</div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;    {</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;    }</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;</div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;</div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast&lt;VkDeviceSize&gt;(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;    {</div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;        {</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;            {</div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;                {</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160;                }</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;            }</div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;        }</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;    }</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;    {</div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;</div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;            memTypeIndex,</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;            0,</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;            <span class="keyword">false</span>); <span class="comment">// isCustomPool</span></div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;    }</div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;}</div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;</div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;{</div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;</div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;    {</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;    }</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;}</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;</div><div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;{</div><div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = &amp;vkFlushMappedMemoryRanges;</div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = &amp;vkInvalidateMappedMemoryRanges;</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;    {</div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;    }</div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;</div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;    {</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;    }</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;</div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;    <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;    {</div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;    }</div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;}</div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;</div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;{</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div><div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;}</div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;</div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;{</div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, Size=%llu&quot;</span>, memTypeIndex, vkMemReq.size);</div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;</div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;    {</div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;    }</div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;        size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;    {</div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;    }</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;</div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;    {</div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;        {</div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;        }</div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;        {</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;                size,</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;                suballocType,</div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;                memTypeIndex,</div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;                dedicatedImage,</div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;                pAllocation);</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;        }</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;    }</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;    {</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;            size,</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;            alignment,</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;            suballocType,</div><div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160;            pAllocation);</div><div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;        {</div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;        }</div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;        {</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;        }</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;        {</div><div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160;                size,</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;                suballocType,</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;                memTypeIndex,</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;                dedicatedImage,</div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;                pAllocation);</div><div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;            {</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;            }</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;            {</div><div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;            }</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;        }</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;    }</div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;}</div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;{</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;    {</div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;        {</div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;        }</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;        {</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;        }</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;    }</div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;</div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;    {</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;    }</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;    {</div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;            m_hDevice,</div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;            hMemory,</div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;            0,</div><div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;            0,</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;        {</div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;        }</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;    }</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;    {</div><div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;    }</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>&#160;    {</div><div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;    }</div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;</div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;}</div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;</div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;    {</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;</div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;</div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;    }</div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    {</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;    }</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;}</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;    VkImage hImage,</div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;    {</div><div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;</div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;    }</div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;    {</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;    }</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;}</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;{</div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;    {</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;    }</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    {</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;    }</div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;    {</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;        {</div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;        }</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;        {</div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;        }</div><div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;    }</div><div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;    {</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;    }</div><div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;</div><div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;    {</div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div><div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;            alignmentForPool,</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;            createInfo,</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;            suballocType,</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;            pAllocation);</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;    }</div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;    {</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;        {</div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;</div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;                alignmentForMemType,</div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;                dedicatedImage,</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;                createInfo,</div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;                memTypeIndex,</div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;                suballocType,</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;                pAllocation);</div><div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;            {</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;            }</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;            {</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;                {</div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;                    {</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;                        alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;                            vkMemReq.alignment,</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;                        </div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;                            vkMemReq.size,</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;                            alignmentForMemType,</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;                            createInfo,</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;                            suballocType,</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;                            pAllocation);</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;                        {</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;                        }</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160;                    }</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;                    {</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;                    }</div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;                }</div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;            }</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;        }</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;    }</div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;}</div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;</div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;{</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;</div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;CanBecomeLost() == <span class="keyword">false</span> ||</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;        allocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;    {</div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;        {</div><div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;            FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div><div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;        }</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;        {</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;            {</div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;                <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;                {</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;                }</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;                {</div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;                }</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;            }</div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;        }</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;    }</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;}</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;{</div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div><div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;    </div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;    {</div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;    }</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;    {</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;        {</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;            m_Pools[poolIndex]-&gt;GetBlockVector().AddStats(pStats);</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;        }</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;    }</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;    {</div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector-&gt;size(); allocIndex &lt; allocCount; ++allocIndex)</div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;        {</div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;        }</div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;    }</div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;}</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;VkResult VmaAllocator_T::Defragment(</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;{</div><div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;    <span class="keywordflow">if</span>(pAllocationsChanged != VMA_NULL)</div><div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;    {</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;        memset(pAllocationsChanged, 0, <span class="keyword">sizeof</span>(*pAllocationsChanged));</div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;    }</div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;    {</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;        memset(pDefragmentationStats, 0, <span class="keyword">sizeof</span>(*pDefragmentationStats));</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;    }</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;</div><div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;</div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;</div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;    {</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;            <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) &amp;&amp;</div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;        {</div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;</div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetPool();</div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;            {</div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;                pAllocBlockVector = &amp;hAllocPool-&gt;GetBlockVector();</div><div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;            }</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;            {</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;            }</div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;            VmaDefragmentator* <span class="keyword">const</span> pDefragmentator = pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;            VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;                &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;            pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;        }</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;    }</div><div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;</div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;</div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160;    VkDeviceSize maxBytesToMove = SIZE_MAX;</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;    uint32_t maxAllocationsToMove = UINT32_MAX;</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;    {</div><div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;        maxBytesToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;        maxAllocationsToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;    }</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    {</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;        {</div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;                pDefragmentationStats,</div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;        }</div><div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;    }</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;</div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; (poolIndex &lt; poolCount) &amp;&amp; (result == VK_SUCCESS); ++poolIndex)</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;    {</div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;        result = m_Pools[poolIndex]-&gt;GetBlockVector().Defragment(</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;            pDefragmentationStats,</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;    }</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;</div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;    {</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;        m_Pools[poolIndex]-&gt;GetBlockVector().DestroyDefragmentator();</div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160;    }</div><div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;    {</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;        {</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;        }</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;    }</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;}</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;</div><div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;{</div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;    {</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;        {</div><div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;            {</div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;            }</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;            {</div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;            }</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;            {</div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;                {</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;                }</div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;            }</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;        }</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;    }</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;    {</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;        {</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;            {</div><div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;            }</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;            {</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;                {</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;                }</div><div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;            }</div><div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;        }</div><div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;    }</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;}</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;</div><div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160;{</div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;    {</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;        {</div><div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;            {</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;            }</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;            {</div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;            }</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;            {</div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;                {</div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;                }</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;            }</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;        }</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;    }</div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;    {</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;        {</div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;            {</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;            }</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;            {</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;                {</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;                }</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;            }</div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;        }</div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;</div><div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;    }</div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;}</div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;</div><div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;{</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;</div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div><div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;    {</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;    }</div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> == 0)</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;    {</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;    }</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo);</div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;</div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;    {</div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;    }</div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;    {</div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;    }</div><div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;</div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;}</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;{</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;    {</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;    }</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;}</div><div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;</div><div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;{</div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;}</div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;{</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;}</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;{</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;}</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;{</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;}</div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;</div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;{</div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;    {</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;        {</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;            VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;            {</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;                finalRes = VK_SUCCESS;</div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;                <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;            }</div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;        }</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;    }</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;</div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;    {</div><div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;        {</div><div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; m_Pools[poolIndex]-&gt;GetBlockVector().GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;            {</div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;GetBlockVector().CheckCorruption();</div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;                {</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;                    finalRes = VK_SUCCESS;</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;                    <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;                }</div><div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160;            }</div><div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>&#160;        }</div><div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;    }</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;</div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;    <span class="keywordflow">return</span> finalRes;</div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;}</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;</div><div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;{</div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;}</div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;</div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;{</div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;</div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;    VkResult res;</div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;    {</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;        {</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;            {</div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;            }</div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;        }</div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;        {</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;        }</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;    }</div><div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;    {</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;    }</div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;</div><div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS &amp;&amp; m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;    {</div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize);</div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;    }</div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;</div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;}</div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;</div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;{</div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;    {</div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size);</div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;    }</div><div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;</div><div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;</div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;    {</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;    }</div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;}</div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;</div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;VkResult VmaAllocator_T::Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;{</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;    {</div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;    }</div><div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;</div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;    {</div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;        {</div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;            {</div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;            }</div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;        }</div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    }</div><div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;}</div><div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;{</div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    {</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;        {</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;        }</div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;    }</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;}</div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer)</div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;{</div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;    {</div><div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160;        res = GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;            m_hDevice,</div><div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;            hBuffer,</div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;    {</div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding buffer to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, hBuffer);</div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;    }</div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;    }</div><div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;}</div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;</div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;VkResult VmaAllocator_T::BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage)</div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;{</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;    {</div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;        res = GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160;            m_hDevice,</div><div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>&#160;            hImage,</div><div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;    {</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding image to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, hImage);</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;    }</div><div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160;    }</div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;}</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;</div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;    VMA_CACHE_OPERATION op)</div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;{</div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div><div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;    {</div><div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;</div><div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;        </div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;        {</div><div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;            {</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;                memRange.size = allocationSize - memRange.offset;</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;            }</div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;            {</div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;                    allocationSize - memRange.offset);</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;            }</div><div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;</div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;        {</div><div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div><div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;            {</div><div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;                size = allocationSize - offset;</div><div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;            }</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;            {</div><div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;            }</div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;            memRange.offset += allocationOffset;</div><div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div><div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;            </div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;        }</div><div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;        </div><div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;        }</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;        <span class="keywordflow">switch</span>(op)</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;        {</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div><div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;        }</div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;    }</div><div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div><div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;}</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;</div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;{</div><div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>&#160;</div><div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;    {</div><div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;    }</div><div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;</div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;    </div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;GetMappedData() != VMA_NULL)</div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;    {</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;    }</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;    </div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;</div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;}</div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;</div><div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div><div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;{</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;    {</div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;        {</div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div><div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div><div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160;            Unmap(hAllocation);</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;        }</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;        {</div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;        }</div><div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;    }</div><div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;}</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;</div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;{</div><div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;    {</div><div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;        {</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;            {</div><div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;                json.BeginObject();</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;            }</div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;</div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;            json.EndString();</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;                </div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;            json.BeginArray();</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; pDedicatedAllocVector-&gt;size(); ++i)</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;            {</div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;                <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;                hAlloc-&gt;PrintParameters(json);</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;                json.EndObject();</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;            }</div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;</div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;            json.EndArray();</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;        }</div><div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160;    }</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;    {</div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;        json.EndObject();</div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;    }</div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;</div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;    {</div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;        {</div><div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;            {</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;                {</div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;                }</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;                json.EndString();</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;</div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>&#160;            }</div><div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;        }</div><div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;        {</div><div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;            json.EndObject();</div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;        }</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;    }</div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;</div><div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;    {</div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;        {</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;            json.BeginObject();</div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;            {</div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;                json.BeginString();</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div><div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;                json.EndString();</div><div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;</div><div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;            }</div><div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;            json.EndObject();</div><div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;        }</div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;    }</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160;}</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;</div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;<span class="keyword">static</span> VkResult AllocateMemoryForImage(</div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;    VkImage image,</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;{</div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;    VMA_ASSERT(allocator &amp;&amp; (image != VK_NULL_HANDLE) &amp;&amp; pAllocationCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;    </div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;</div><div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;AllocateMemory(</div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;        vkMemReq,</div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;        *pAllocationCreateInfo,</div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;        suballocType,</div><div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;        pAllocation);</div><div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;}</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;</div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;{</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;}</div><div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;{</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;    {</div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;    }</div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;}</div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;</div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;{</div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;}</div><div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160;</div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160;{</div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;}</div><div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;</div><div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;{</div><div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;}</div><div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;</div><div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;{</div><div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;</div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;}</div><div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;</div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;{</div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;}</div><div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;</div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;</div><div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;{</div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;</div><div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;    {</div><div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;        json.BeginObject();</div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;</div><div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;</div><div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;    </div><div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;        {</div><div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;            json.EndString();</div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;            json.BeginObject();</div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;</div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;</div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;            {</div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;            }</div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;            json.EndArray();</div><div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160;</div><div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;            {</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;            }</div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;            {</div><div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;                {</div><div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;                    json.EndString();</div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;</div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;</div><div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160;                    {</div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;                    }</div><div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;                    {</div><div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;                    }</div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;                    {</div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;                    }</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;                    {</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;                    }</div><div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;                    {</div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;                    }</div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;                    json.EndArray();</div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;</div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;                    {</div><div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;                    }</div><div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;</div><div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;                    json.EndObject();</div><div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;                }</div><div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160;            }</div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;</div><div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;            json.EndObject();</div><div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;        }</div><div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;        {</div><div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;        }</div><div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;</div><div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;        json.EndObject();</div><div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;    }</div><div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;    {</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160;    }</div><div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160;}</div><div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;</div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;{</div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;    {</div><div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;    }</div><div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;}</div><div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;</div><div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div><div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;{</div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;</div><div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div><div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;    {</div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;    }</div><div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;    </div><div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160;</div><div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;    <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;    {</div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;    }</div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div><div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;    {</div><div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div><div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;        {</div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;        }</div><div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div><div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div><div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;        {</div><div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;        }</div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;    }</div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;</div><div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;    {</div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;        {</div><div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;            {</div><div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div><div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;                {</div><div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;                    {</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;                    }</div><div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;                }</div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;            }</div><div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;        }</div><div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;    }</div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>&#160;}</div><div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>&#160;</div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;{</div><div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;</div><div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;    {</div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;</div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;            allocator,</div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;    }</div><div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;}</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;</div><div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;{</div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;</div><div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;    {</div><div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;</div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;            allocator,</div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;</div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;    }</div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;}</div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;</div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;{</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;</div><div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;</div><div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;}</div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;</div><div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;{</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;    {</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;    }</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;</div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;</div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;}</div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;{</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;</div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;</div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;}</div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;{</div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;</div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;</div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;}</div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;</div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;{</div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;</div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;</div><div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div><div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;</div><div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div><div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160;}</div><div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;</div><div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;{</div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;</div><div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;</div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;</div><div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;        pAllocation);</div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;    {</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;    }</div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;</div><div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;}</div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;</div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;{</div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;</div><div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;</div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;</div><div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;</div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;        vkMemReq,</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;        pAllocation);</div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;</div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;    {</div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;    }</div><div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;</div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;}</div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;</div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;    VkImage image,</div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;{</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;</div><div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;</div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;</div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;    VkResult result = AllocateMemoryForImage(</div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;        allocator,</div><div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;        image,</div><div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;        pCreateInfo,</div><div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;        pAllocation);</div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;</div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;    {</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;    }</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;}</div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;{</div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;    {</div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;    }</div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;}</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;</div><div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160;{</div><div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;</div><div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;</div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;}</div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;</div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;{</div><div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;</div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;</div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;}</div><div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;</div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;{</div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;</div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;</div><div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;}</div><div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;</div><div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;{</div><div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;</div><div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;}</div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;</div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;{</div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160;</div><div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;}</div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;</div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;{</div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160;</div><div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;}</div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;{</div><div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;</div><div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div><div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;</div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;</div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;}</div><div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;</div><div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160;{</div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;</div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;</div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;</div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;}</div><div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;</div><div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div><div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;{</div><div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;</div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div><div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;</div><div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;</div><div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;}</div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;</div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;{</div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocations);</div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;</div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragment&quot;</span>);</div><div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;</div><div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;</div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);</div><div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;}</div><div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;</div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;{</div><div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;</div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160;</div><div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;</div><div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, buffer);</div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;}</div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;</div><div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;    VkImage image)</div><div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;{</div><div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160;</div><div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;</div><div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;</div><div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, image);</div><div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;}</div><div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;</div><div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;{</div><div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;    </div><div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;    </div><div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;</div><div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;        pBuffer);</div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;    {</div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;</div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;         <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;         <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div><div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;        {</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;        }</div><div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;        {</div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;        }</div><div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;        {</div><div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;        }</div><div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160;</div><div class="line"><a name="l10054"></a><span class="lineno">10054</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;            vkMemReq,</div><div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;            pAllocation);</div><div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160;        {</div><div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;            res = allocator-&gt;BindBufferMemory(*pAllocation, *pBuffer);</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;            {</div><div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div><div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;                {</div><div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;                }</div><div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;            }</div><div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;        }</div><div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;    }</div><div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;}</div><div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;</div><div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;{</div><div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;    {</div><div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;    }</div><div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;    {</div><div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;    }</div><div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;}</div><div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;</div><div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l10112"></a><span class="lineno">10112</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;{</div><div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;</div><div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;</div><div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;</div><div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;</div><div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;        pImage);</div><div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;    {</div><div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;        </div><div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;        res = AllocateMemoryForImage(allocator, *pImage, pAllocationCreateInfo, suballocType, pAllocation);</div><div class="line"><a name="l10142"></a><span class="lineno">10142</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10143"></a><span class="lineno">10143</span>&#160;        {</div><div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;            res = allocator-&gt;BindImageMemory(*pAllocation, *pImage);</div><div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160;            {</div><div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div><div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;                {</div><div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;                }</div><div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;            }</div><div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;        }</div><div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;    }</div><div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;}</div><div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;</div><div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;    VkImage image,</div><div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;{</div><div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;    {</div><div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;    }</div><div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;    {</div><div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;    }</div><div class="line"><a name="l10187"></a><span class="lineno">10187</span>&#160;}</div><div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160;</div><div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div><div class="ttc" id="struct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1271</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdoc">Set this flag if the allocation should have its own memory block. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1537</div></div>
+<a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment">// in the Software without restriction, including without limitation the rights</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">// copies of the Software, and to permit persons to whom the Software is</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">// furnished to do so, subject to the following conditions:</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">// The above copyright notice and this permission notice shall be included in</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">// all copies or substantial portions of the Software.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment">// THE SOFTWARE.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01264"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1264</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01286"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1286</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;</div><div class="line"><a name="l01299"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1299</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div><div class="line"><a name="l01301"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1301</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l01303"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1303</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;</div><div class="line"><a name="l01307"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1307</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div><div class="line"><a name="l01312"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1312</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div><div class="line"><a name="l01334"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1334</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;</div><div class="line"><a name="l01336"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1336</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01338"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1338</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;</div><div class="line"><a name="l01344"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1344</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div><div class="line"><a name="l01345"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1345</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01346"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1346</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01347"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1347</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01348"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1348</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01349"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1349</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01350"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1350</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01351"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1351</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div><div class="line"><a name="l01352"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1352</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div><div class="line"><a name="l01353"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1353</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01354"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1354</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01355"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1355</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01356"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1356</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01357"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1357</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01358"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1358</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01359"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1359</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01360"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1360</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;</div><div class="line"><a name="l01368"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 1368</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div><div class="line"><a name="l01374"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 1374</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;    </div><div class="line"><a name="l01376"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 1376</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div><div class="line"><a name="l01378"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 1378</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;<span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="preprocessor">    #ifdef _WIN32</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 1</span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01388"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1388</a></span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 0</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;</div><div class="line"><a name="l01393"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 1393</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;{</div><div class="line"><a name="l01396"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 1396</a></span>&#160;    VmaRecordFlags <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l01404"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 1404</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a>;</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;</div><div class="line"><a name="l01408"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1408</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;{</div><div class="line"><a name="l01411"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1411</a></span>&#160;    VmaAllocatorCreateFlags <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;</div><div class="line"><a name="l01414"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1414</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;</div><div class="line"><a name="l01417"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1417</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;</div><div class="line"><a name="l01420"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1420</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;</div><div class="line"><a name="l01423"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1423</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;</div><div class="line"><a name="l01426"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1426</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01440"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1440</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01464"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1464</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div><div class="line"><a name="l01476"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1476</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div><div class="line"><a name="l01483"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 1483</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;</div><div class="line"><a name="l01536"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1536</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;{</div><div class="line"><a name="l01539"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1539</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01541"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1541</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01543"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1543</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01545"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1545</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01547"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1547</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01548"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1548</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div><div class="line"><a name="l01549"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1549</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;</div><div class="line"><a name="l01553"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1553</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;{</div><div class="line"><a name="l01555"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1555</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01556"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1556</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01557"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1557</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;</div><div class="line"><a name="l01565"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1565</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;</div><div class="line"><a name="l01593"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1593</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;{</div><div class="line"><a name="l01598"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1598</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div><div class="line"><a name="l01615"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1615</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div><div class="line"><a name="l01625"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1625</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div><div class="line"><a name="l01632"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1632</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div><div class="line"><a name="l01641"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1641</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div><div class="line"><a name="l01642"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1642</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;</div><div class="line"><a name="l01646"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1646</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div><div class="line"><a name="l01658"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1658</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;</div><div class="line"><a name="l01669"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1669</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div><div class="line"><a name="l01682"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1682</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div><div class="line"><a name="l01695"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1695</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div><div class="line"><a name="l01702"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1702</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div><div class="line"><a name="l01708"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1708</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;</div><div class="line"><a name="l01710"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1710</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01712"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1712</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;</div><div class="line"><a name="l01714"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1714</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;{</div><div class="line"><a name="l01717"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1717</a></span>&#160;    VmaAllocationCreateFlags <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01723"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1723</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div><div class="line"><a name="l01728"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1728</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l01733"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 1733</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l01741"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 1741</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l01747"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 1747</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div><div class="line"><a name="l01754"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 1754</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01816"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 1816</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div><div class="line"><a name="l01834"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 1834</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;</div><div class="line"><a name="l01836"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 1836</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l01838"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 1838</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;</div><div class="line"><a name="l01842"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 1842</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div><div class="line"><a name="l01845"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 1845</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l01848"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 1848</a></span>&#160;    VmaPoolCreateFlags <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l01853"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 1853</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l01858"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 1858</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div><div class="line"><a name="l01866"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 1866</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div><div class="line"><a name="l01880"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 1880</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;</div><div class="line"><a name="l01885"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 1885</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div><div class="line"><a name="l01888"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 1888</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l01891"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 1891</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l01894"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 1894</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div><div class="line"><a name="l01897"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 1897</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l01904"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 1904</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;</div><div class="line"><a name="l01990"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 1990</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l01995"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 1995</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l02004"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 2004</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l02009"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 2009</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l02014"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 2014</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l02023"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 2023</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div><div class="line"><a name="l02028"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 2028</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;    VkImage image,</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits);</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;</div><div class="line"><a name="l02239"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 2239</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div><div class="line"><a name="l02244"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 2244</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l02249"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 2249</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;</div><div class="line"><a name="l02253"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 2253</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div><div class="line"><a name="l02255"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 2255</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l02257"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 2257</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l02259"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 2259</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l02261"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 2261</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;    VkImage image);</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;    VkImage image,</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;}</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;<span class="comment">Define to 0 if you are going to provide you own pointers to Vulkan functions via</span></div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;<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="l02502"></a><span class="lineno"> 2502</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;<span class="preprocessor">#if defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;{</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;    {</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;    }</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;}</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;    {</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, static_cast&lt;unsigned int&gt;(num));</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;    }</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;    {</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, static_cast&lt;unsigned long long&gt;(num));</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;    }</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;    <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;    {</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;    }</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;    <span class="keyword">class </span>VmaMutex</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;    {</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;        VmaMutex() { }</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;        ~VmaMutex() { }</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;        std::mutex m_Mutex;</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;    };</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic:</span></div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;<span class="preprocessor">#ifndef VMA_BEST_FIT</span></div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;<span class="preprocessor">    #define VMA_BEST_FIT (1)</span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>&#160;</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;<span class="preprocessor">        private: \</span></div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;</div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;{</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;}</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;{</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;}</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;{</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;    <span class="keywordflow">return</span> val / align * align;</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;}</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;<span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;{</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;}</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;<span class="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="l02810"></a><span class="lineno"> 2810</span>&#160;{</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;}</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;{</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    {</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;        {</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;            {</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;            }</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;            ++insertIndex;</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;        }</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;    }</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;    {</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;    }</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;}</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;{</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;    {</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    }</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;}</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;    VkDeviceSize pageSize)</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;{</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;}</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;{</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;};</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;    VmaSuballocationType suballocType2)</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;{</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;    {</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;    }</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;    </div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;    {</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;    }</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;}</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;{</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;    {</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;    }</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;}</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;<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="l02938"></a><span class="lineno"> 2938</span>&#160;{</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;    <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;    {</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;        {</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;        }</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;    }</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;}</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;<span class="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="l02952"></a><span class="lineno"> 2952</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;{</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLock)</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;    {</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;        {</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;            m_pMutex-&gt;Lock();</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;        }</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;    }</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;    </div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    ~VmaMutexLock()</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    {</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;        {</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;            m_pMutex-&gt;Unlock();</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;        }</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;    }</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;};</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> CmpT&gt;</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpT cmp)</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;{</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;    <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;    {</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;        {</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;            down = mid + 1;</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;        }</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;        {</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160;            up = mid;</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;        }</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;    }</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;    <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;}</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;<span class="comment">// Memory allocation</span></div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;<span class="keyword">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="l03019"></a><span class="lineno"> 3019</span>&#160;{</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;    {</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;            size,</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;            alignment,</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;    }</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;    {</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;    }</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;}</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;<span class="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="l03036"></a><span class="lineno"> 3036</span>&#160;{</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;    {</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;    }</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;    {</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;    }</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;}</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;{</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;}</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;{</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;}</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;<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="l03066"></a><span class="lineno"> 3066</span>&#160;{</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;}</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;{</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;    {</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;        {</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;        }</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;    }</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;}</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;{</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;    </div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;    }</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;    }</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;};</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;{</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;}</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;{</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;    vec.erase(vec.begin() + index);</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;}</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;{</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;        m_Count(0),</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;        m_Capacity(0)</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;    {</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;    }</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;        m_Count(count),</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;        m_Capacity(count)</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;    {</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;    }</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;    </div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;    {</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;        {</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;        }</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;    }</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;    </div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;    ~VmaVector()</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;    {</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;    }</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;    {</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;        {</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;            resize(rhs.m_Count);</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;            {</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;            }</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;        }</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;    }</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;    </div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;    </div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;    {</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;    }</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;    }</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;    T&amp; front()</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;    {</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;    }</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;    }</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;    T&amp; back()</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;    {</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;    }</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;    }</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;    <span class="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="l03223"></a><span class="lineno"> 3223</span>&#160;    {</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;        </div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;        {</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;            newCapacity = m_Capacity;</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;        }</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;        </div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;        {</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;            {</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;            }</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;        }</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;    }</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;    {</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;        {</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;        }</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;        {</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;            newCapacity = newCount;</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;        }</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;        {</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;            {</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;            }</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;        }</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;    }</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;    {</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;    }</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;    {</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;        {</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;        }</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;        m_pArray[index] = src;</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;    }</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;    <span class="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;    {</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;        {</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;        }</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;        resize(oldCount - 1);</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;    }</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;    {</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;        m_pArray[newIndex] = src;</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;    }</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    <span class="keywordtype">void</span> pop_back()</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;    {</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;        resize(size() - 1);</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;    }</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;    {</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;        insert(0, src);</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    }</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;    {</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;        <span class="keyword">remove</span>(0);</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;    }</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;    T* m_pArray;</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;};</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;{</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;}</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;{</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;    vec.remove(index);</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;}</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;{</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;        vector.data(),</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;        value,</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;}</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;{</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;        vector.begin(),</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;        vector.end(),</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;        value,</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;        comparator);</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;    {</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;    }</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;}</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;<span class="keywordtype">size_t</span> VmaVectorFindSorted(<span class="keyword">const</span> VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;{</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;        vector.data(),</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;        value,</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;        comparator);</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    <span class="keywordflow">if</span>(it != vector.size() &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;    {</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;        <span class="keywordflow">return</span> it - vector.begin();</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;    }</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;    {</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;        <span class="keywordflow">return</span> vector.size();</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;    }</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;}</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;{</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;    T* Alloc();</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;    <span class="keyword">union </span>Item</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;    {</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;        uint32_t NextFreeIndex;</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;        T Value;</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;    };</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;    <span class="keyword">struct </span>ItemBlock</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;    {</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;        Item* pItems;</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;        uint32_t FirstFreeIndex;</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    };</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;    </div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;};</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock) :</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;{</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;}</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;{</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;    Clear();</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;}</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;{</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;}</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;{</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;    {</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;        {</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;        }</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;    }</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;}</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160;</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;{</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_ItemBlocks.size(); ++i)</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;    {</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;        </div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;        </div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + m_ItemsPerBlock))</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;        {</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;        }</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;    }</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;}</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;{</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;    ItemBlock newBlock = {</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;    m_ItemBlocks.push_back(newBlock);</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;}</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160;</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;{</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;    T Value;</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;};</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;<span class="keyword">class </span>VmaRawList</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;{</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;    VMA_CLASS_NO_COPY(VmaRawList)</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;    <span class="keywordtype">void</span> PopFront();</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;    </div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;};</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;    m_Count(0)</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;{</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;}</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;{</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;}</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;{</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160;    {</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;        {</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;            pItem = pPrevItem;</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;        }</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160;        m_pFront = VMA_NULL;</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;        m_Count = 0;</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;    }</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;}</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;{</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;    {</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;    }</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;    {</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;        ++m_Count;</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;    }</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;}</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;{</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;    {</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;    }</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;    {</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;        ++m_Count;</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;    }</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;}</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;{</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;}</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;{</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;}</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;{</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;    {</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;    }</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;    --m_Count;</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;}</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;{</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;    {</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;    }</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;    m_pFront = pNextItem;</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;    --m_Count;</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;}</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;{</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;    {</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;    }</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;    {</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;    }</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160;</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;    {</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;    }</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;    {</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;    }</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;    --m_Count;</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;}</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;{</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;    {</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;        {</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;            prevItem-&gt;pNext = newItem;</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;        }</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;        {</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;        }</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;        ++m_Count;</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;    }</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;}</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160;</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;{</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;    {</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;        {</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;        }</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;        {</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;        }</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;        ++m_Count;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;    }</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;        <span class="keywordflow">return</span> PushFront();</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;}</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;{</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;}</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;{</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;}</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;<span class="keyword">class </span>VmaList</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;{</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;    VMA_CLASS_NO_COPY(VmaList)</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;    {</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;        iterator() :</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;        {</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;        }</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;        }</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;        }</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;        iterator&amp; operator++()</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;        {</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;        }</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;        iterator&amp; operator--()</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;        {</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;            {</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;            }</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;            {</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;            }</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;        }</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;        {</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;        }</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;        {</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;        }</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;        }</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;        }</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;        </div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;        {</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;        }</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;    };</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;    <span class="keyword">class </span>const_iterator</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;    {</div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;        const_iterator() :</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;        {</div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;        }</div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;        {</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;        }</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;        </div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;        }</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;        }</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;        const_iterator&amp; operator++()</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        {</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;        }</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;        const_iterator&amp; operator--()</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;        {</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;            {</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;            }</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;            {</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;            }</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;        }</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;        {</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;        }</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;        {</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;        }</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;        }</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;        }</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;        </div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;        {</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;        }</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;    };</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;</div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;};</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;<span class="comment">// class VmaMap</span></div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;<span class="comment">// Unused in this version.</span></div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;{</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;    T1 first;</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;    T2 second;</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;    VmaPair() : first(), second() { }</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;};</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;{</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;    </div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;};</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;{</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;    }</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    }</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;};</div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;{</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;        pair,</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;}</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;{</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;        key,</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;    {</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;    }</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;    {</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;    }</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;}</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;{</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;}</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;{</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocation_T)</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;    {</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;    };</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    {</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;    };</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;        m_Size(0),</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;    {</div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;        m_BufferImageUsage = 0;</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;    }</div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;    ~VmaAllocation_T()</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;    {</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;    }</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;    {</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;        m_Size = size;</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;    }</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;    {</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;    }</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;        VkDeviceSize offset);</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;        VkDeviceSize size)</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;    {</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;        m_Size = size;</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;    }</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;    <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;</div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;    }</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetPool() <span class="keyword">const</span>;</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;    </div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;    }</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;    {</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;    }</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;    {</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;    }</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;    VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;    <span class="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;    {</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;        VMA_ASSERT(m_BufferImageUsage == 0);</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;    }</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;</div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;    {</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hPool; <span class="comment">// Null if belongs to general memory.</span></div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;    };</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;    {</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;    };</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;    <span class="keyword">union</span></div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;    {</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;    };</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;    uint32_t m_CreationFrameIndex;</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;};</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;{</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;};</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;{</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;    }</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;};</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;{</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata)</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160;    ~VmaBlockMetadata();</div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;    <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;    <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;    VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;    VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;    <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;    <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;    <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;    uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;    VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;    <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;};</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;{</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    VmaBlockMetadata m_Metadata;</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;    ~VmaDeviceMemoryBlock()</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;    {</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;        VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;    }</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;        VkDeviceSize newSize,</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;        uint32_t <span class="keywordtype">id</span>);</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;    <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;    </div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;</div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;        VkBuffer hBuffer);</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;        VkImage hImage);</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;    VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    <span class="comment">// Protects access to m_hMemory so it&#39;s not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;    <span class="comment">// Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;};</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;<span class="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;{</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;    <span class="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="l04534"></a><span class="lineno"> 4534</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;    }</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;};</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;{</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockVector)</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;        <span class="keywordtype">bool</span> isCustomPool);</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;    ~VmaBlockVector();</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;    VkResult CreateMinBlocks();</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.empty(); }</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;    VkResult Allocate(</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;    <span class="keywordtype">void</span> Free(</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;    VkResult CheckCorruption();</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;        uint32_t&amp; maxAllocationsToMove);</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;    <span class="keywordtype">void</span> DestroyDefragmentator();</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;    uint32_t m_NextBlockId;</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;};</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;<span class="keyword">struct </span>VmaPool_T</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;{</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;    VmaBlockVector m_BlockVector;</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    VmaPool_T(</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo);</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;    ~VmaPool_T();</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;</div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;    VmaBlockVector&amp; GetBlockVector() { <span class="keywordflow">return</span> m_BlockVector; }</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;</div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;};</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;<span class="keyword">class </span>VmaDefragmentator</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;{</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;    VMA_CLASS_NO_COPY(VmaDefragmentator)</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;    {</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;            m_pChanged(VMA_NULL)</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;        {</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;        }</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;    };</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;    {</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;        }</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    };</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;    <span class="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;    {</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;        {</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;        }</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;        {</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_Metadata.GetAllocationCount();</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;        }</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;        {</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;        }</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;        VkResult EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData);</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;        <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;    };</div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;    {</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;        <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="l04735"></a><span class="lineno"> 4735</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;        }</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;        <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="l04739"></a><span class="lineno"> 4739</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;        }</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;    };</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;    {</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;        <span class="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="l04749"></a><span class="lineno"> 4749</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;            {</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;            }</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;            {</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;            }</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;            {</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;            }</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;        }</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;    };</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    BlockInfoVector m_Blocks;</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;    VkResult DefragmentRound(</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;    ~VmaDefragmentator();</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;    <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="l04789"></a><span class="lineno"> 4789</span>&#160;</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;};</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;<span class="keyword">class </span>VmaRecorder</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;{</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;    VmaRecorder();</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex);</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled);</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;    ~VmaRecorder();</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;    <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;    <span class="keyword">struct </span>CallParams</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;    {</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;        uint32_t threadId;</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;        <span class="keywordtype">double</span> time;</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;    };</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;    <span class="keyword">class </span>UserDataString</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;    {</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;        UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;    };</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;    FILE* m_File;</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;    VMA_MUTEX m_FileMutex;</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;    int64_t m_Freq;</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;    int64_t m_StartCounter;</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;    <span class="keywordtype">void</span> Flush();</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;};</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;{</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;    </div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;    <span class="comment">// Number of bytes free out of limit, or VK_WHOLE_SIZE if not limit for that heap.</span></div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;</div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;    VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;    }</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;    }</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;    }</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    }</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;    }</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;    }</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;    }</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;        VkImage hImage,</div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;    <span class="keywordtype">void</span> FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;        VkBool32* pAllocationsChanged,</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;    <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="l05012"></a><span class="lineno"> 5012</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;    <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;</div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;    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="l05033"></a><span class="lineno"> 5033</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;    VkResult BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer);</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;    VkResult BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage);</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;        VMA_CACHE_OPERATION op);</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;    <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="l05044"></a><span class="lineno"> 5044</span>&#160;</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;    </div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;    uint32_t m_NextPoolId;</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;    VmaRecorder* m_pRecorder;</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;    <span class="keywordtype">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="l05063"></a><span class="lineno"> 5063</span>&#160;</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;    <span class="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;};</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;<span class="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="l05097"></a><span class="lineno"> 5097</span>&#160;{</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;}</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;<span class="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="l05102"></a><span class="lineno"> 5102</span>&#160;{</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;}</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;{</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;}</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;{</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;}</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;{</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;    {</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;        ptr-&gt;~T();</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;    }</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;}</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;{</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;    {</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;    }</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;}</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;<span class="comment">// VmaStringBuilder</span></div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;{</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;    VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;};</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;{</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;    {</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;    }</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;}</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;{</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;    Add(buf);</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;}</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;{</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;    Add(buf);</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;}</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;{</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;    Add(buf);</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;}</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;</div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;<span class="comment">// VmaJsonWriter</span></div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;{</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;    ~VmaJsonWriter();</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;    </div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    <span class="keywordtype">void</span> EndArray();</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    </div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    </div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;    {</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;        COLLECTION_TYPE_ARRAY,</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;    };</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;    <span class="keyword">struct </span>StackItem</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;    {</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;        COLLECTION_TYPE type;</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;    };</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;};</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;    m_SB(sb),</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;    m_InsideString(false)</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;{</div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;}</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;{</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;}</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;{</div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;    StackItem item;</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;}</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;{</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;}</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;{</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;    StackItem item;</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;}</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;{</div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;</div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;}</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;{</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;    EndString();</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;}</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;{</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;</div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;    {</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;    }</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;}</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;{</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;    {</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        {</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;        }</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;        {</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;        }</div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;        {</div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;            m_SB.Add(ch);</div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;        }</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;        {</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;        }</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;    }</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;}</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;</div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;{</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;}</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;{</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;}</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;<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="l05391"></a><span class="lineno"> 5391</span>&#160;{</div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;    m_SB.AddPointer(ptr);</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;}</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;{</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    {</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;    }</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;}</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;{</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;}</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;{</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;}</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;{</div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;}</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;{</div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;}</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;{</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;    {</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;            currItem.valueCount % 2 == 0)</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        {</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;            VMA_ASSERT(isString);</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;        }</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;            currItem.valueCount % 2 != 0)</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;        {</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;        }</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;        {</div><div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;            WriteIndent();</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;        }</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;        {</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;            WriteIndent();</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;        }</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;        ++currItem.valueCount;</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;    }</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;}</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;{</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    {</div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;        m_SB.AddNewLine();</div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;        </div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;        {</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;            --count;</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;        }</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;        {</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;            m_SB.Add(INDENT);</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;        }</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;    }</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;}</div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;</div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;<span class="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="l05487"></a><span class="lineno"> 5487</span>&#160;{</div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;    {</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;</div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;        {</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrSrc = (<span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;            <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrDst = vma_new_array(hAllocator, <span class="keywordtype">char</span>, newStrLen + 1);</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;        }</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;    }</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;    {</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    }</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;}</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;{</div><div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;    {</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;    }</div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;</div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;    m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;}</div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;</div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;    {</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;    }</div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;}</div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;    {</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;    }</div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;}</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;    {</div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;    }</div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;}</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;    {</div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;        {</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;        }</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;        {</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;        }</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;    }</div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;}</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;</div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;    {</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;    }</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;}</div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;</div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;<a class="code" href="struct_vma_pool.html">VmaPool</a> VmaAllocation_T::GetPool()<span class="keyword"> const</span></div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;}</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;{</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;    {</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;        {</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;        }</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;        {</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;        }</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;        {</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;            {</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;            }</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;        }</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;    }</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;}</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;};</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;    {</div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;        {</div><div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;        }</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;        {</div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;            json.BeginString();</div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;            json.EndString();</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;        }</div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;    }</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;    {</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;    }</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;}</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;</div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;{</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;    {</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> oldStr = (<span class="keywordtype">char</span>*)m_pUserData;</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;    }</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;}</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;{</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;    {</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;        ++m_MapCount;</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;    }</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;    {</div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;    }</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;}</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;{</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;    {</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;    }</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;    {</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;    }</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;}</div><div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;</div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;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="l05741"></a><span class="lineno"> 5741</span>&#160;{</div><div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;</div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;    {</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;        {</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;        }</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;        {</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        }</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;    }</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;    {</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;            ppData);</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;        {</div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;        }</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;    }</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;}</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;{</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    {</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;        {</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;        }</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    }</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;    {</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;    }</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;}</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;{</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;</div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;    {</div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;        json.EndObject();</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;    }</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;    {</div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;        json.EndObject();</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;    }</div><div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;</div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;    json.EndObject();</div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;}</div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;</div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;{</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    }</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;    }</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;};</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;    m_Size(0),</div><div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;{</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;}</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;VmaBlockMetadata::~VmaBlockMetadata()</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;{</div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;}</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Init(VkDeviceSize size)</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;{</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;    m_Size = size;</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;    m_FreeCount = 1;</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;    --suballocItem;</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;}</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;    <span class="keywordflow">if</span>(m_Suballocations.empty())</div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160;    {</div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;    }</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;    </div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculates from previous ones.</span></div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;</div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;    {</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;        </div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;        <span class="keywordflow">if</span>(subAlloc.offset != calculatedOffset)</div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;        {</div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;        }</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;        <span class="keywordflow">if</span>(prevFree &amp;&amp; currFree)</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;        {</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;        }</div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;</div><div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;        <span class="keywordflow">if</span>(currFree != (subAlloc.hAllocation == VK_NULL_HANDLE))</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;        {</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;        }</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;        <span class="keywordflow">if</span>(currFree)</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;        {</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;            {</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;                ++freeSuballocationsToRegister;</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;            }</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;</div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &lt; VMA_DEBUG_MARGIN)</div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;            {</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;            }</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;        }</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;        {</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetOffset() != subAlloc.offset)</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;            {</div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;            }</div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetSize() != subAlloc.size)</div><div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;            {</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;            }</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; !prevFree)</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;            {</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;            }</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;        }</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;        prevFree = currFree;</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;    }</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;</div><div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;    <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.size() != freeSuballocationsToRegister)</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;    {</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;    }</div><div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;    {</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;        </div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;        {</div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;        }</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;size &lt; lastSize)</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;        {</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;        }</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;        lastSize = suballocItem-&gt;size;</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;    }</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;</div><div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;    <span class="keywordflow">if</span>(!ValidateFreeSuballocationList() ||</div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;        (calculatedOffset != m_Size) ||</div><div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;        (calculatedSumFreeSize != m_SumFreeSize) ||</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;        (calculatedFreeCount != m_FreeCount))</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;    {</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;    }</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;}</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;VkDeviceSize VmaBlockMetadata::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;    {</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;    }</div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;    {</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;    }</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;}</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;</div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;}</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;</div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;    </div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;    {</div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;        {</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;            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="l06059"></a><span class="lineno"> 6059</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;        }</div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;        {</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;            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="l06064"></a><span class="lineno"> 6064</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;        }</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;    }</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;}</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;</div><div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div><div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += m_Size;</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;}</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;    json.BeginObject();</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;    json.WriteNumber(m_SumFreeSize);</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;</div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;    json.WriteNumber((uint64_t)m_Suballocations.size() - m_FreeCount);</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;    json.WriteNumber(m_FreeCount);</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    json.BeginArray();</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;        ++suballocItem, ++i)</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;    {</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;        </div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;        json.WriteNumber(suballocItem-&gt;offset);</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;        {</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;            json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;            json.WriteNumber(suballocItem-&gt;size);</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;        }</div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;        {</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;            suballocItem-&gt;hAllocation-&gt;PrintParameters(json);</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;        }</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;        json.EndObject();</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;    }</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;    json.EndArray();</div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;</div><div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;    json.EndObject();</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;}</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;<span class="comment">How many suitable free suballocations to analyze before choosing best one.</span></div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;<span class="comment">- Set to 1 to use First-Fit algorithm - first suitable free suballocation will</span></div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;<span class="comment">  be chosen.</span></div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;<span class="comment">- Set to UINT32_MAX to use Best-Fit/Worst-Fit algorithm - all suitable free</span></div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;<span class="comment">  suballocations will be analized and best one will be chosen.</span></div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;<span class="comment">- Any other value is also acceptable.</span></div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;<span class="comment">//static const uint32_t MAX_SUITABLE_SUBALLOCATIONS_TO_CHECK = 8;</span></div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CreateAllocationRequest(</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;{</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;    <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="l06158"></a><span class="lineno"> 6158</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp; m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;    {</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;    }</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;    {</div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;        <span class="keywordflow">if</span>(VMA_BEST_FIT)</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;        {</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;            {</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;                    allocSize,</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;                    allocAlignment,</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;                    allocType,</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;                {</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;                }</div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;            }</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;        }</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;        {</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div><div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;            {</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;                    allocSize,</div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;                    allocAlignment,</div><div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;                    allocType,</div><div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;                {</div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;                }</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;            }</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;        }</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;    }</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;    {</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;            ++suballocIt)</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;        {</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;            {</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;                    allocSize,</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;                    allocAlignment,</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;                    allocType,</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;                    suballocIt,</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;                {</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;                    tmpAllocRequest.item = suballocIt;</div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div><div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160;                    {</div><div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;                    }</div><div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;                }</div><div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;            }</div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        }</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        {</div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;        }</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;    }</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;}</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::MakeRequestedAllocationsLost(</div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;{</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;    {</div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;        {</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;            ++pAllocationRequest-&gt;item;</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;        }</div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;        {</div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;        }</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;        {</div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;        }</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;    }</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;</div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;    </div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;}</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;uint32_t VmaBlockMetadata::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;{</div><div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;        ++it)</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;    {</div><div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;        {</div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;            it = FreeSuballocation(it);</div><div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;        }</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;    }</div><div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;}</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;VkResult VmaBlockMetadata::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;{</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;        ++it)</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;    {</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;        {</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;            {</div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;            }</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;            {</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;            }</div><div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;        }</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;    }</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;}</div><div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;</div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Alloc(</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;{</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;    UnregisterFreeSuballocation(request.item);</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;    suballoc.offset = request.offset;</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;    suballoc.hAllocation = hAllocation;</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;</div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;    <span class="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="l06371"></a><span class="lineno"> 6371</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;    {</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;        ++next;</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;    }</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;    <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="l06385"></a><span class="lineno"> 6385</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;    {</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;    }</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;    {</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;    }</div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;    {</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;    }</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;}</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;{</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;    {</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;        {</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;        }</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;    }</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;}</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;{</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;    {</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;        {</div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;        }</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;    }</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;}</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;    {</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;        {</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;        }</div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;        {</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;        }</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; lastSize)</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;        {</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;        }</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;        lastSize = it-&gt;size;</div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;    }</div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;}</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;</div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CheckAllocation(</div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;    </div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    *pSumItemSize = 0;</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;</div><div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;    {</div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;        {</div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;        }</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;        {</div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;            {</div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;            }</div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;            {</div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;            }</div><div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;        }</div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;</div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;        <span class="keywordflow">if</span>(m_Size - suballocItem-&gt;offset &lt; allocSize)</div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;        {</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;        }</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;</div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;    </div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;        {</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;        }</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;    </div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;</div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;        {</div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;            {</div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;                {</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;                    {</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;                    }</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;                }</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;            }</div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;            {</div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;            }</div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;        }</div><div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;    </div><div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;        {</div><div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;        }</div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;    </div><div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; m_Size)</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;        {</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;        }</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;</div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;        {</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;            {</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;                ++lastSuballocItem;</div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;                {</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;                }</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;                {</div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;                }</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;                {</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;                    {</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;                    }</div><div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;                    {</div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;                    }</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;                }</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;            }</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;        }</div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;        {</div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;            {</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;                {</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;                    {</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;                        {</div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;                        }</div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;                        {</div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;                        }</div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;                    }</div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;                }</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;                {</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;                }</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;            }</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;        }</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;    }</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160;    {</div><div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;        {</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;        }</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;        *pOffset = suballoc.offset;</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;    </div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;        {</div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;        }</div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;    </div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;    </div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;        {</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;            {</div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;                {</div><div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;                    {</div><div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;                    }</div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;                }</div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;            }</div><div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;            {</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;            }</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;        }</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;    </div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;        {</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;        }</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;        {</div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;            {</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;                {</div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;                    {</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;                    }</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;                }</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;                {</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;                }</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;            }</div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;        }</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;    }</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;</div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;}</div><div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160;</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;{</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;    </div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;    ++nextItem;</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;</div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;}</div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;</div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;{</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;    </div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;</div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;    </div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;    ++nextItem;</div><div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div><div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;    {</div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;    }</div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    {</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;        --prevItem;</div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;        {</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;        }</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;    }</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    {</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;        MergeFreeWithNext(suballocItem);</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;    }</div><div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;</div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    {</div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;    }</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;    {</div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;    }</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;}</div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;{</div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;</div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;</div><div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;    {</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;        {</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;        }</div><div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;        {</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;        }</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;    }</div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;</div><div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;}</div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;</div><div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;</div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;{</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;</div><div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;    {</div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;            item,</div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;            ++index)</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;        {</div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;            {</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;            }</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;        }</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;    }</div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;</div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;}</div><div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;    m_Metadata(hAllocator),</div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;    m_Id(0),</div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;{</div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;}</div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;</div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;    VkDeviceSize newSize,</div><div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;    uint32_t <span class="keywordtype">id</span>)</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;{</div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;</div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;    m_Id = id;</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;</div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;    m_Metadata.Init(newSize);</div><div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;}</div><div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;{</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;    VMA_ASSERT(m_Metadata.IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;    </div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_Metadata.GetSize(), m_hMemory);</div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;}</div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;    <span class="keywordflow">if</span>((m_hMemory == VK_NULL_HANDLE) ||</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;        (m_Metadata.GetSize() == 0))</div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;    {</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;    }</div><div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;    </div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;    <span class="keywordflow">return</span> m_Metadata.Validate();</div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;}</div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;{</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;    {</div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;    }</div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;    res = m_Metadata.CheckCorruption(pData);</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;}</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;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="l06936"></a><span class="lineno"> 6936</span>&#160;{</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;    {</div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;    }</div><div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;    {</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;        {</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;        }</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;    }</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;    {</div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;            m_hMemory,</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;        {</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;            {</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;            }</div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;        }</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    }</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;}</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;{</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;    {</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;    }</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;</div><div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;    {</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;        {</div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;        }</div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;    }</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;    {</div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;    }</div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;}</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;</div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;{</div><div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;    {</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;    }</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;}</div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;{</div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;    {</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;    }</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;    {</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    }</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;    {</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;    }</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;}</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;    VkBuffer hBuffer)</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;{</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;        hBuffer,</div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;        m_hMemory,</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;}</div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;    VkImage hImage)</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;{</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;        hImage,</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;        m_hMemory,</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;}</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;{</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;}</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div><div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;{</div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;}</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;</div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;{</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;}</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;</div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo) :</div><div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;    m_BlockVector(</div><div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;        hAllocator,</div><div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;        createInfo.blockSize,</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;        true), <span class="comment">// isCustomPool</span></div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;    m_Id(0)</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;{</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;}</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;{</div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;}</div><div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;</div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;</div><div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;</div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;    <span class="keywordtype">bool</span> isCustomPool) :</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;    m_pDefragmentator(VMA_NULL),</div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;    m_NextBlockId(0)</div><div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;{</div><div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;}</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;{</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;    {</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;    }</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;}</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;{</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;    {</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;        {</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;        }</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;    }</div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;}</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;{</div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;    {</div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;        pBlock-&gt;m_Metadata.AddPoolStats(*pStats);</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;    }</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;}</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;}</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;{</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;    <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="l07215"></a><span class="lineno"> 7215</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div><div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;    {</div><div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;    }</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;    <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;    <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;    {</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;        VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;        VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;        <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;            currentFrameIndex,</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;            m_FrameInUseCount,</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;            m_BufferImageGranularity,</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;            size,</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;            alignment,</div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;            suballocType,</div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;            <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;            &amp;currRequest))</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;        {</div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;            <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;            VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;</div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;            {</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;                VkResult res = pCurrBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;                {</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;                }</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;            }</div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;            </div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;            <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;            <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;            {</div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;            }</div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;            </div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;            pCurrBlock-&gt;m_Metadata.Alloc(currRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;                hCurrentPool,</div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;                pCurrBlock,</div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;                currRequest.offset,</div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;                alignment,</div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;                size,</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;                suballocType,</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;                mapped,</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;            VMA_HEAVY_ASSERT(pCurrBlock-&gt;Validate());</div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;            {</div><div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;                m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;            }</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;            <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;            {</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;                VkResult res = pCurrBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;                VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;            }</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;        }</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;    }</div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;    <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;    <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;    {</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;        <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;        VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;        uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;        <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;</div><div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;        <span class="comment">// Allocating blocks of other sizes is allowed only in default pools.</span></div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;        <span class="comment">// In custom pools block size is fixed.</span></div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;        {</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;            <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;            <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;            {</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;                {</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;                }</div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;                {</div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;                }</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;            }</div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;        }</div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;</div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;        <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;        VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;        <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div><div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;        {</div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;            <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div><div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;            {</div><div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;                {</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;                    res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;                }</div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;                {</div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;                }</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;            }</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;        }</div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;        {</div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160;            VMA_ASSERT(pBlock-&gt;m_Metadata.GetSize() &gt;= size);</div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;</div><div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160;            {</div><div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;                res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;                {</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;                }</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;            }</div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;            <span class="comment">// Allocate from pBlock. Because it is empty, dstAllocRequest can be trivially filled.</span></div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;            VmaAllocationRequest allocRequest;</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;            <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;                currentFrameIndex,</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;                m_FrameInUseCount,</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;                m_BufferImageGranularity,</div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;                size,</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;                alignment,</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;                suballocType,</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;                &amp;allocRequest))</div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;            {</div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;                *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;                pBlock-&gt;m_Metadata.Alloc(allocRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;                (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;                    pBlock,</div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;                    allocRequest.offset,</div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;                    alignment,</div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;                    size,</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;                    suballocType,</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;                    mapped,</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;                    (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;                VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new allocation Size=%llu&quot;</span>, allocInfo.allocationSize);</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;                (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;                {</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;                    m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;                }</div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;                <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;                {</div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;                    res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, allocRequest.offset, size);</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;                    VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;                }</div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;            }</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160;            {</div><div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;                <span class="comment">// Allocation from empty block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;            }</div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;        }</div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;    }</div><div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;</div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;</div><div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;    {</div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;        {</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;            <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;            {</div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;                VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;                <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;                    m_BufferImageGranularity,</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;                    size,</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;                    alignment,</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;                    suballocType,</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;                    &amp;currRequest))</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;                {</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;                    <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;                        currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;                    {</div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;                        pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;                        bestRequest = currRequest;</div><div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;                        bestRequestCost = currRequestCost;</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;</div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;                        <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;                        {</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;                        }</div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;                    }</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;                }</div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;            }</div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;            {</div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;                {</div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;                    {</div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;                    }</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;                }</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;</div><div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.MakeRequestedAllocationsLost(</div><div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;                {</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;                    {</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;                    }</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;                    pBestRequestBlock-&gt;m_Metadata.Alloc(bestRequest, suballocType, size, *pAllocation);</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;                        alignment,</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;                        size,</div><div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;                        suballocType,</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;                        mapped,</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;                    {</div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;                    }</div><div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;                    {</div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;                    }</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;                }</div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;            }</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;            {</div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;            }</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;        }</div><div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;        {</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;        }</div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;    }</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;</div><div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;}</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;{</div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;</div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;    {</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;        {</div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;        }</div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;        {</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;        }</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;</div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;        pBlock-&gt;m_Metadata.Free(hAllocation);</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;</div><div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;</div><div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;        {</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;            <span class="comment">// Already has empty Allocation. We don&#39;t want to have two, so delete this one.</span></div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;            {</div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;            }</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;            <span class="comment">// We now have first empty block.</span></div><div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;            {</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;            }</div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;        }</div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div><div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;        {</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_Metadata.IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;            {</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;            }</div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;        }</div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;    }</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;</div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;    {</div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;    }</div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;}</div><div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;    VkDeviceSize result = 0;</div><div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    {</div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_Metadata.GetSize());</div><div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        {</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;        }</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;    }</div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;}</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;{</div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;    {</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160;        {</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;        }</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;    }</div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;}</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;{</div><div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;    <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;    {</div><div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_Metadata.GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;        {</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;            VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;        }</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;    }</div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;}</div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;</div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;{</div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;    {</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;    }</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;        mem,</div><div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;        allocInfo.allocationSize,</div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;        m_NextBlockId++);</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    {</div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;    }</div><div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;</div><div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;}</div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;</div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;{</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;</div><div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;    json.BeginObject();</div><div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;</div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;    {</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;</div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;</div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;        {</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;        }</div><div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;        {</div><div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;        }</div><div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;        json.EndObject();</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;</div><div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;        {</div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;        }</div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;    }</div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;    {</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;    }</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;</div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;    json.BeginObject();</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;    {</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;        json.BeginString();</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;        json.EndString();</div><div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;        m_Blocks[i]-&gt;m_Metadata.PrintDetailedMap(json);</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;    }</div><div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;    json.EndObject();</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;    json.EndObject();</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;}</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;</div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;{</div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;    {</div><div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;            hAllocator,</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;    }</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;</div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;}</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;{</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;    {</div><div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;    }</div><div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;</div><div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;    {</div><div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;        <span class="keyword">const</span> VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;        <span class="keyword">const</span> uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;        maxBytesToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;        maxAllocationsToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;    }</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;    </div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;    {</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;        {</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;            {</div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;                {</div><div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;                }</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;            }</div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;            {</div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;            }</div><div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160;        }</div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;    }</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;}</div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;{</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;    {</div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;    }</div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;}</div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;</div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;{</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;    {</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;        lostAllocationCount += pBlock-&gt;m_Metadata.MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;    }</div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;    {</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;    }</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;}</div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;</div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;{</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;    {</div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;    }</div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;    {</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;        {</div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;        }</div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;    }</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;}</div><div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;{</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;</div><div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;</div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;    {</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;        pBlock-&gt;m_Metadata.CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;    }</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;}</div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;</div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;{</div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;}</div><div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;</div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;{</div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;    {</div><div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;    }</div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;}</div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;{</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;}</div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160;</div><div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160;VkResult VmaDefragmentator::BlockInfo::EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData)</div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;{</div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;    {</div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;    }</div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;            </div><div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;GetMappedData())</div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;    {</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;        *ppMappedData = m_pBlock-&gt;GetMappedData();</div><div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;    }</div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;            </div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;}</div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::BlockInfo::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;{</div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;    {</div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;    }</div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;}</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;</div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;{</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;    {</div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;    }</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;    {</div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div><div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations - they are sorted from largest to smallest.</span></div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;        {</div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;            {</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;                {</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;                }</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;                {</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;                }</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;            }</div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;            {</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;            }</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;        }</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;        </div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;</div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;        {</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;                size,</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;                alignment,</div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160;                suballocType,</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;            {</div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;                {</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;                }</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;</div><div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;                {</div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;                }</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;                {</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;                }</div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;                </div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;                memcpy(</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;                {</div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset + size);</div><div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;                }</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;                </div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.Alloc(dstAllocRequest, suballocType, size, allocInfo.m_hAllocation);</div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_Metadata.FreeAtOffset(srcOffset);</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;                </div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;</div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;                {</div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;                }</div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;</div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;</div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;</div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;            }</div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;        }</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;</div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;</div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;        {</div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;        }</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;        {</div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;            {</div><div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;            }</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;            {</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;            }</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;        }</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    }</div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;}</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;{</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;    {</div><div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;    }</div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;    {</div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;    }</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;</div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;    <span class="comment">// Move allocation infos from m_Allocations to appropriate m_Blocks[memTypeIndex].m_Allocations.</span></div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0, allocCount = m_Allocations.size(); blockIndex &lt; allocCount; ++blockIndex)</div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;    {</div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;        <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;        {</div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;            {</div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;            }</div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;            {</div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;            }</div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;        }</div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;    }</div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;    {</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;    }</div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;</div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;</div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> round = 0; (round &lt; 2) &amp;&amp; (result == VK_SUCCESS); ++round)</div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;    {</div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;    }</div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;    {</div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;    }</div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;</div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;}</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;{</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;    {</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;    }</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;    {</div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;    }</div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;    {</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;    }</div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;}</div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;<span class="comment">// VmaRecorder</span></div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;</div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;VmaRecorder::VmaRecorder() :</div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;    m_UseMutex(true),</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;    m_Flags(0),</div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;    m_File(VMA_NULL),</div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;    m_Freq(INT64_MAX),</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;    m_StartCounter(INT64_MAX)</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;{</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;}</div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;</div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex)</div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;{</div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;    m_UseMutex = useMutex;</div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;</div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;m_Freq);</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;    QueryPerformanceCounter((LARGE_INTEGER*)&amp;m_StartCounter);</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;    <span class="comment">// Open file for writing.</span></div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;    errno_t err = fopen_s(&amp;m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;    <span class="keywordflow">if</span>(err != 0)</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;    {</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;    }</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;    <span class="comment">// Write header.</span></div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;Vulkan Memory Allocator,Calls recording&quot;</span>);</div><div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,3&quot;</span>);</div><div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;}</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;</div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;VmaRecorder::~VmaRecorder()</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;{</div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;    {</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;        fclose(m_File);</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;    }</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;}</div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;</div><div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div><div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160;{</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;    Flush();</div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;}</div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;</div><div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;{</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;    Flush();</div><div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;}</div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreatePool(uint32_t frameIndex, <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;{</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;</div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;        pool);</div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;    Flush();</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;}</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;{</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;</div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyPool,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;        pool);</div><div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;    Flush();</div><div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;}</div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;{</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;        allocation,</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;    Flush();</div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;}</div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;</div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;{</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>&#160;        allocation,</div><div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;    Flush();</div><div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;}</div><div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;{</div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;</div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;        allocation,</div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;    Flush();</div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;}</div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;{</div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;</div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;        allocation);</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;    Flush();</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;}</div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;</div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;{</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;</div><div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;    UserDataString userDataStr(</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;        allocation-&gt;IsUserDataString() ? <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> : 0,</div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;        pUserData);</div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;        allocation,</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;    Flush();</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;}</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;{</div><div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;</div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateLostAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;        allocation);</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    Flush();</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;}</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;{</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;</div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;        allocation);</div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;    Flush();</div><div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;}</div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;{</div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaUnmapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;        allocation);</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;    Flush();</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;}</div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;</div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;{</div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;        allocation,</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;        offset,</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;        size);</div><div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;    Flush();</div><div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;}</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;{</div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;</div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;        allocation,</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;        offset,</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;        size);</div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;    Flush();</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;}</div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;</div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;{</div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;</div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;        bufCreateInfo.flags,</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;        bufCreateInfo.size,</div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;        bufCreateInfo.usage,</div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;        bufCreateInfo.sharingMode,</div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;        allocation,</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;    Flush();</div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;}</div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;{</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;</div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;        imageCreateInfo.flags,</div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;        imageCreateInfo.imageType,</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;        imageCreateInfo.format,</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;        imageCreateInfo.extent.width,</div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;        imageCreateInfo.extent.height,</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;        imageCreateInfo.extent.depth,</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;        imageCreateInfo.mipLevels,</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;        imageCreateInfo.arrayLayers,</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;        imageCreateInfo.samples,</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;        imageCreateInfo.tiling,</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;        imageCreateInfo.usage,</div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;        imageCreateInfo.sharingMode,</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;        imageCreateInfo.initialLayout,</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;        allocation,</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;    Flush();</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;}</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160;{</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyBuffer,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;        allocation);</div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;    Flush();</div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;}</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;{</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;</div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyImage,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;        allocation);</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;    Flush();</div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;}</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;</div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;{</div><div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaTouchAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;        allocation);</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;    Flush();</div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;}</div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;{</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;</div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaGetAllocationInfo,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;        allocation);</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;    Flush();</div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;}</div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;</div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;{</div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;    CallParams callParams;</div><div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;        pool);</div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;    Flush();</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;}</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;VmaRecorder::UserDataString::UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;{</div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;    {</div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;        <span class="keywordflow">if</span>((allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0)</div><div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160;        {</div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;        }</div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;        {</div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;            sprintf_s(m_PtrStr, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;            m_Str = m_PtrStr;</div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;        }</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;    }</div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;    {</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;    }</div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;}</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;</div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled)</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;{</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;</div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;</div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div><div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;    {</div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,size,%llu\n&quot;</span>, i, memProps.memoryHeaps[i].size);</div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,flags,%u\n&quot;</span>, i, memProps.memoryHeaps[i].flags);</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    }</div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;    {</div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,heapIndex,%u\n&quot;</span>, i, memProps.memoryTypes[i].heapIndex);</div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n&quot;</span>, i, memProps.memoryTypes[i].propertyFlags);</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;    }</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_dedicated_allocation,%u\n&quot;</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n&quot;</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALIGNMENT,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div><div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MARGIN,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n&quot;</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div><div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n&quot;</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div><div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n&quot;</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div><div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div><div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;</div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;}</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;{</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;    outParams.threadId = GetCurrentThreadId();</div><div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;    LARGE_INTEGER counter;</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    QueryPerformanceCounter(&amp;counter);</div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;}</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;</div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;{</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;    <span class="keywordflow">if</span>((m_Flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;    {</div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;        fflush(m_File);</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;    }</div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;}</div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;</div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;</div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;    m_NextPoolId(0)</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;    ,m_pRecorder(VMA_NULL)</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;#endif</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;{</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;    {</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;    }</div><div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;</div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);</div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0)</div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160;    {</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    }</div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;</div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;        </div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;    {</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;    }</div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;</div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;    {</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;    }</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;</div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast&lt;VkDeviceSize&gt;(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160;    {</div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;        {</div><div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;            {</div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;                {</div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;                }</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;            }</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;        }</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;    }</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;    {</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;            memTypeIndex,</div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;            0,</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;            <span class="keyword">false</span>); <span class="comment">// isCustomPool</span></div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;</div><div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160;    }</div><div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;}</div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;VkResult VmaAllocator_T::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo)</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;{</div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;</div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &amp;&amp;</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;        !VmaStrIsEmpty(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-&gt;<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;    {</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;        res = m_pRecorder-&gt;Init(*pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div><div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;        {</div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;        }</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;            m_PhysicalDeviceProperties,</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;            m_MemProps,</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;            m_UseKhrDedicatedAllocation);</div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.&quot;</span>);</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;    }</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;}</div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;{</div><div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;    {</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</div><div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;    }</div><div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;    </div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;    {</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;    }</div><div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;}</div><div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;</div><div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;{</div><div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = &amp;vkFlushMappedMemoryRanges;</div><div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = &amp;vkInvalidateMappedMemoryRanges;</div><div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;    {</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;    }</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;    {</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;    }</div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;</div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;    <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;    {</div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;    }</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;}</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;</div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;{</div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;}</div><div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;</div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;{</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, Size=%llu&quot;</span>, memTypeIndex, vkMemReq.size);</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;</div><div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160;</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;    {</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;    }</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;        size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;    {</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;    }</div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;    {</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;        {</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;        }</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;        {</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;                size,</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;                suballocType,</div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;                memTypeIndex,</div><div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;                dedicatedImage,</div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;                pAllocation);</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;        }</div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;    }</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;    {</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;            size,</div><div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160;            alignment,</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;            suballocType,</div><div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;            pAllocation);</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;        {</div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;        }</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;        {</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;        }</div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;        {</div><div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>&#160;                size,</div><div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;                suballocType,</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;                memTypeIndex,</div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;                dedicatedImage,</div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;                pAllocation);</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;            {</div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;            }</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;            {</div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;            }</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;        }</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;    }</div><div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;}</div><div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;</div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;{</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;</div><div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;</div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;    {</div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;        {</div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;        }</div><div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;        {</div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;        }</div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;    }</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;</div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;    {</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;    }</div><div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;</div><div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;    {</div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;            m_hDevice,</div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;            hMemory,</div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;            0,</div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;            0,</div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;        {</div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;        }</div><div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;    }</div><div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;</div><div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;    {</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;    }</div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;    {</div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;    }</div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;</div><div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;</div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;}</div><div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;</div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;    {</div><div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;</div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;</div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;</div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;</div><div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;    }</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;    {</div><div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;    }</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;}</div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;</div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;    VkImage hImage,</div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;    {</div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;</div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>&#160;</div><div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;</div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;    }</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;    {</div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>&#160;    }</div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;}</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;{</div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;    {</div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;    }</div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div><div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;    {</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div><div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;    }</div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;    {</div><div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;        {</div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;        }</div><div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;        {</div><div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;        }</div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;    }</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;    {</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;    }</div><div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>&#160;</div><div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;    {</div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div><div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div><div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div><div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;            alignmentForPool,</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;            createInfo,</div><div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160;            suballocType,</div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;            pAllocation);</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;    }</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;    {</div><div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;        {</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;</div><div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;                alignmentForMemType,</div><div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;                dedicatedImage,</div><div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160;                createInfo,</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;                memTypeIndex,</div><div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;                suballocType,</div><div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;                pAllocation);</div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;            {</div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;            }</div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;            {</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;                {</div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;                    {</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;                        alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;                            vkMemReq.alignment,</div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;                        </div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;                            vkMemReq.size,</div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;                            alignmentForMemType,</div><div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;                            createInfo,</div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;                            suballocType,</div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;                            pAllocation);</div><div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;                        {</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;                        }</div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;                    }</div><div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;                    {</div><div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>&#160;                    }</div><div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160;                }</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;            }</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;        }</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div><div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;    }</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;}</div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;</div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;{</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;</div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;CanBecomeLost() == <span class="keyword">false</span> ||</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;        allocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;    {</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;        {</div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;            FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;        }</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;        {</div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;            {</div><div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;                <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;                {</div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;                }</div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;                {</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;                }</div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;            }</div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;        }</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;    }</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>&#160;}</div><div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;</div><div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;{</div><div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;    </div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;    {</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;    }</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;</div><div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;    {</div><div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;        {</div><div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;            m_Pools[poolIndex]-&gt;GetBlockVector().AddStats(pStats);</div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;        }</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160;    }</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;    {</div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector-&gt;size(); allocIndex &lt; allocCount; ++allocIndex)</div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;        {</div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;        }</div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;    }</div><div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;</div><div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;}</div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;</div><div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div><div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;VkResult VmaAllocator_T::Defragment(</div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;{</div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;    <span class="keywordflow">if</span>(pAllocationsChanged != VMA_NULL)</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;    {</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        memset(pAllocationsChanged, 0, <span class="keyword">sizeof</span>(*pAllocationsChanged));</div><div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;    }</div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;    {</div><div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;        memset(pDefragmentationStats, 0, <span class="keyword">sizeof</span>(*pDefragmentationStats));</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;    }</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;</div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;</div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;</div><div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;</div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;    {</div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;            <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) &amp;&amp;</div><div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;        {</div><div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160;</div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetPool();</div><div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;            {</div><div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;                pAllocBlockVector = &amp;hAllocPool-&gt;GetBlockVector();</div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;            }</div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;            {</div><div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160;            }</div><div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;</div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;            VmaDefragmentator* <span class="keyword">const</span> pDefragmentator = pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;</div><div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;            VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;                &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;            pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;        }</div><div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>&#160;    }</div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;</div><div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;</div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;    VkDeviceSize maxBytesToMove = SIZE_MAX;</div><div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;    uint32_t maxAllocationsToMove = UINT32_MAX;</div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;    {</div><div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;        maxBytesToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;        maxAllocationsToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;    }</div><div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;</div><div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;    {</div><div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;        {</div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;                pDefragmentationStats,</div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;        }</div><div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;    }</div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;</div><div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; (poolIndex &lt; poolCount) &amp;&amp; (result == VK_SUCCESS); ++poolIndex)</div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;    {</div><div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;        result = m_Pools[poolIndex]-&gt;GetBlockVector().Defragment(</div><div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;            pDefragmentationStats,</div><div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;    }</div><div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;</div><div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;</div><div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;    {</div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;        m_Pools[poolIndex]-&gt;GetBlockVector().DestroyDefragmentator();</div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;    }</div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;</div><div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;    {</div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;        {</div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;        }</div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;    }</div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;</div><div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;}</div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160;{</div><div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;    {</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;        {</div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;            {</div><div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160;            }</div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;            {</div><div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;            }</div><div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;            {</div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;                {</div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;                }</div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;            }</div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;        }</div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;    }</div><div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;    {</div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160;        {</div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;            {</div><div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;            }</div><div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;            {</div><div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;                {</div><div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;                }</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;            }</div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;        }</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div><div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;    }</div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;}</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;{</div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;    {</div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;        {</div><div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;            {</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;            }</div><div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;            {</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;            }</div><div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;            {</div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;                {</div><div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;                }</div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;            }</div><div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;        }</div><div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;    }</div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;    {</div><div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;        {</div><div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;            {</div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;            }</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;            {</div><div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;                {</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;                }</div><div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;            }</div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;        }</div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;</div><div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;    }</div><div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;}</div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;</div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;{</div><div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;</div><div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;</div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;    {</div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;    }</div><div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> == 0)</div><div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;    {</div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;    }</div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;</div><div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo);</div><div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;</div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;    {</div><div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;    }</div><div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;</div><div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;    {</div><div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div><div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;    }</div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;</div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;}</div><div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;</div><div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;{</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;    {</div><div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;    }</div><div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;</div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>&#160;}</div><div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>&#160;</div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;{</div><div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;}</div><div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;</div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;{</div><div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;}</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;</div><div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;{</div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;}</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;</div><div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div><div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;{</div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;}</div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;</div><div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div><div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;{</div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;</div><div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;    {</div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;        {</div><div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;            VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;            {</div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;                finalRes = VK_SUCCESS;</div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;                <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;            }</div><div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;        }</div><div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;    }</div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;</div><div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;    {</div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;        {</div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; m_Pools[poolIndex]-&gt;GetBlockVector().GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;            {</div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;GetBlockVector().CheckCorruption();</div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;                {</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;                    finalRes = VK_SUCCESS;</div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;                    <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;                }</div><div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;            }</div><div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;        }</div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;    }</div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;    <span class="keywordflow">return</span> finalRes;</div><div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;}</div><div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;</div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;{</div><div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div><div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;}</div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;</div><div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;{</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;    VkResult res;</div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;    {</div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;        {</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;            {</div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;            }</div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;        }</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;        {</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;        }</div><div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;    }</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;    {</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;    }</div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;</div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS &amp;&amp; m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;    {</div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize);</div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;    }</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160;</div><div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;}</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;{</div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;    {</div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size);</div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;    }</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;</div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;</div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;    {</div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;    }</div><div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;}</div><div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;</div><div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160;VkResult VmaAllocator_T::Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;{</div><div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160;    {</div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;    }</div><div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;</div><div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;    {</div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;        {</div><div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div><div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;            {</div><div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;            }</div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;        }</div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;    }</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;}</div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;</div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;{</div><div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;    {</div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;        {</div><div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;        }</div><div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;    }</div><div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160;}</div><div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>&#160;</div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer)</div><div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;{</div><div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;    {</div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;        res = GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;            m_hDevice,</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;            hBuffer,</div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;    {</div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding buffer to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, hBuffer);</div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;    }</div><div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;    }</div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;}</div><div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;</div><div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;VkResult VmaAllocator_T::BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage)</div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;{</div><div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;    {</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;        res = GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;            m_hDevice,</div><div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;            hImage,</div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;    {</div><div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding image to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, hImage);</div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;    }</div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;    }</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;}</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;</div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;    VMA_CACHE_OPERATION op)</div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;{</div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;    {</div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;</div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;        </div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;        {</div><div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;            {</div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;                memRange.size = allocationSize - memRange.offset;</div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;            }</div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;            {</div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;                    allocationSize - memRange.offset);</div><div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;            }</div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;</div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;        {</div><div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div><div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;            {</div><div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;                size = allocationSize - offset;</div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;            }</div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;            {</div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;            }</div><div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div><div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div><div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;            memRange.offset += allocationOffset;</div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div><div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;            </div><div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;        }</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;        </div><div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;        }</div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;</div><div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;        <span class="keywordflow">switch</span>(op)</div><div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160;        {</div><div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div><div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div><div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;        }</div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;    }</div><div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div><div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;}</div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;</div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;{</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160;</div><div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;    {</div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;    }</div><div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;</div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;    </div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;GetMappedData() != VMA_NULL)</div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;    {</div><div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</div><div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;    }</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160;    </div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;</div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;}</div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;</div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;{</div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div><div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;    {</div><div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;        {</div><div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div><div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div><div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;            Unmap(hAllocation);</div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;        }</div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;        {</div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;        }</div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;    }</div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;}</div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;</div><div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;</div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;{</div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;    {</div><div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;        {</div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;            {</div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;                json.BeginObject();</div><div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;            }</div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;</div><div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;            json.EndString();</div><div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;                </div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;            json.BeginArray();</div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;</div><div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; pDedicatedAllocVector-&gt;size(); ++i)</div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;            {</div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;                <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div><div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;                hAlloc-&gt;PrintParameters(json);</div><div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;                json.EndObject();</div><div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160;            }</div><div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;</div><div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;            json.EndArray();</div><div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;        }</div><div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;    }</div><div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;    {</div><div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;        json.EndObject();</div><div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;    }</div><div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;</div><div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160;    {</div><div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;        {</div><div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;            {</div><div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;                {</div><div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;                }</div><div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;</div><div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;                json.EndString();</div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;            }</div><div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;        }</div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;        {</div><div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;            json.EndObject();</div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;        }</div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;    }</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;</div><div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;    {</div><div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;        {</div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;            json.BeginObject();</div><div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;            {</div><div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;                json.BeginString();</div><div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div><div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;                json.EndString();</div><div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;</div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;            }</div><div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;            json.EndObject();</div><div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;        }</div><div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;    }</div><div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;}</div><div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;</div><div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160;</div><div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;</div><div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;{</div><div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div><div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div><div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160;}</div><div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;</div><div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;{</div><div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;    {</div><div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;    }</div><div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;}</div><div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;</div><div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;{</div><div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;}</div><div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;</div><div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;{</div><div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;}</div><div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;</div><div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;{</div><div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;}</div><div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160;</div><div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;{</div><div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;</div><div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10112"></a><span class="lineno">10112</span>&#160;</div><div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;}</div><div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;</div><div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;{</div><div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;}</div><div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;</div><div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;</div><div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160;{</div><div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;</div><div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;    {</div><div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;        json.BeginObject();</div><div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;</div><div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l10142"></a><span class="lineno">10142</span>&#160;</div><div class="line"><a name="l10143"></a><span class="lineno">10143</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;    </div><div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160;        {</div><div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160;            json.EndString();</div><div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;            json.BeginObject();</div><div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;</div><div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;</div><div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160;            {</div><div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;            }</div><div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;            json.EndArray();</div><div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;</div><div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160;            {</div><div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;            }</div><div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;</div><div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;            {</div><div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;                {</div><div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;                    json.EndString();</div><div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;</div><div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;</div><div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;                    {</div><div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;                    }</div><div class="line"><a name="l10187"></a><span class="lineno">10187</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160;                    {</div><div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;                    }</div><div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;                    {</div><div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;                    }</div><div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;                    {</div><div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;                    }</div><div class="line"><a name="l10199"></a><span class="lineno">10199</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l10200"></a><span class="lineno">10200</span>&#160;                    {</div><div class="line"><a name="l10201"></a><span class="lineno">10201</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l10202"></a><span class="lineno">10202</span>&#160;                    }</div><div class="line"><a name="l10203"></a><span class="lineno">10203</span>&#160;                    json.EndArray();</div><div class="line"><a name="l10204"></a><span class="lineno">10204</span>&#160;</div><div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;                    {</div><div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;                    }</div><div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;</div><div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160;                    json.EndObject();</div><div class="line"><a name="l10212"></a><span class="lineno">10212</span>&#160;                }</div><div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;            }</div><div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;</div><div class="line"><a name="l10215"></a><span class="lineno">10215</span>&#160;            json.EndObject();</div><div class="line"><a name="l10216"></a><span class="lineno">10216</span>&#160;        }</div><div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l10218"></a><span class="lineno">10218</span>&#160;        {</div><div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;        }</div><div class="line"><a name="l10221"></a><span class="lineno">10221</span>&#160;</div><div class="line"><a name="l10222"></a><span class="lineno">10222</span>&#160;        json.EndObject();</div><div class="line"><a name="l10223"></a><span class="lineno">10223</span>&#160;    }</div><div class="line"><a name="l10224"></a><span class="lineno">10224</span>&#160;</div><div class="line"><a name="l10225"></a><span class="lineno">10225</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l10226"></a><span class="lineno">10226</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div><div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;    {</div><div class="line"><a name="l10229"></a><span class="lineno">10229</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l10230"></a><span class="lineno">10230</span>&#160;    }</div><div class="line"><a name="l10231"></a><span class="lineno">10231</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l10232"></a><span class="lineno">10232</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;}</div><div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;</div><div class="line"><a name="l10235"></a><span class="lineno">10235</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l10236"></a><span class="lineno">10236</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10237"></a><span class="lineno">10237</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l10238"></a><span class="lineno">10238</span>&#160;{</div><div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;    {</div><div class="line"><a name="l10241"></a><span class="lineno">10241</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l10243"></a><span class="lineno">10243</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l10244"></a><span class="lineno">10244</span>&#160;    }</div><div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;}</div><div class="line"><a name="l10246"></a><span class="lineno">10246</span>&#160;</div><div class="line"><a name="l10247"></a><span class="lineno">10247</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;</div><div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div><div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10254"></a><span class="lineno">10254</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l10255"></a><span class="lineno">10255</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l10257"></a><span class="lineno">10257</span>&#160;{</div><div class="line"><a name="l10258"></a><span class="lineno">10258</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l10259"></a><span class="lineno">10259</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;</div><div class="line"><a name="l10262"></a><span class="lineno">10262</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div><div class="line"><a name="l10263"></a><span class="lineno">10263</span>&#160;    {</div><div class="line"><a name="l10264"></a><span class="lineno">10264</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l10265"></a><span class="lineno">10265</span>&#160;    }</div><div class="line"><a name="l10266"></a><span class="lineno">10266</span>&#160;    </div><div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160;</div><div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;    <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;    {</div><div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;    }</div><div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;</div><div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div><div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;    {</div><div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div><div class="line"><a name="l10280"></a><span class="lineno">10280</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10281"></a><span class="lineno">10281</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div><div class="line"><a name="l10282"></a><span class="lineno">10282</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l10283"></a><span class="lineno">10283</span>&#160;        {</div><div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;        }</div><div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div><div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div><div class="line"><a name="l10291"></a><span class="lineno">10291</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l10292"></a><span class="lineno">10292</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l10293"></a><span class="lineno">10293</span>&#160;        {</div><div class="line"><a name="l10294"></a><span class="lineno">10294</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l10295"></a><span class="lineno">10295</span>&#160;        }</div><div class="line"><a name="l10296"></a><span class="lineno">10296</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div><div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10301"></a><span class="lineno">10301</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10302"></a><span class="lineno">10302</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10303"></a><span class="lineno">10303</span>&#160;    }</div><div class="line"><a name="l10304"></a><span class="lineno">10304</span>&#160;</div><div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l10306"></a><span class="lineno">10306</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l10307"></a><span class="lineno">10307</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l10309"></a><span class="lineno">10309</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l10310"></a><span class="lineno">10310</span>&#160;    {</div><div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l10313"></a><span class="lineno">10313</span>&#160;        {</div><div class="line"><a name="l10314"></a><span class="lineno">10314</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;            {</div><div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div><div class="line"><a name="l10320"></a><span class="lineno">10320</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l10321"></a><span class="lineno">10321</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;                {</div><div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160;                    {</div><div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10328"></a><span class="lineno">10328</span>&#160;                    }</div><div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;                }</div><div class="line"><a name="l10331"></a><span class="lineno">10331</span>&#160;            }</div><div class="line"><a name="l10332"></a><span class="lineno">10332</span>&#160;        }</div><div class="line"><a name="l10333"></a><span class="lineno">10333</span>&#160;    }</div><div class="line"><a name="l10334"></a><span class="lineno">10334</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;}</div><div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;</div><div class="line"><a name="l10337"></a><span class="lineno">10337</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10339"></a><span class="lineno">10339</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l10340"></a><span class="lineno">10340</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;{</div><div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;</div><div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10350"></a><span class="lineno">10350</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l10351"></a><span class="lineno">10351</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l10352"></a><span class="lineno">10352</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;    {</div><div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;</div><div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;            allocator,</div><div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l10363"></a><span class="lineno">10363</span>&#160;</div><div class="line"><a name="l10364"></a><span class="lineno">10364</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l10365"></a><span class="lineno">10365</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;    }</div><div class="line"><a name="l10367"></a><span class="lineno">10367</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;}</div><div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;</div><div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10374"></a><span class="lineno">10374</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160;{</div><div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l10379"></a><span class="lineno">10379</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l10380"></a><span class="lineno">10380</span>&#160;</div><div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;    {</div><div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160;</div><div class="line"><a name="l10391"></a><span class="lineno">10391</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;            allocator,</div><div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;</div><div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;    }</div><div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;}</div><div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;</div><div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10405"></a><span class="lineno">10405</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;{</div><div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l10409"></a><span class="lineno">10409</span>&#160;    </div><div class="line"><a name="l10410"></a><span class="lineno">10410</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;    </div><div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;    </div><div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;    </div><div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10418"></a><span class="lineno">10418</span>&#160;    {</div><div class="line"><a name="l10419"></a><span class="lineno">10419</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div><div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160;    }</div><div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;    </div><div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;}</div><div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;</div><div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10428"></a><span class="lineno">10428</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;{</div><div class="line"><a name="l10430"></a><span class="lineno">10430</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10431"></a><span class="lineno">10431</span>&#160;    </div><div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;    {</div><div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;    }</div><div class="line"><a name="l10436"></a><span class="lineno">10436</span>&#160;    </div><div class="line"><a name="l10437"></a><span class="lineno">10437</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;    </div><div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10440"></a><span class="lineno">10440</span>&#160;    </div><div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;    {</div><div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;    }</div><div class="line"><a name="l10446"></a><span class="lineno">10446</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10447"></a><span class="lineno">10447</span>&#160;</div><div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;}</div><div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;</div><div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10453"></a><span class="lineno">10453</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l10454"></a><span class="lineno">10454</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;{</div><div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;</div><div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;</div><div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;}</div><div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;</div><div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;{</div><div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;</div><div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;</div><div class="line"><a name="l10472"></a><span class="lineno">10472</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10473"></a><span class="lineno">10473</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;    {</div><div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;    }</div><div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;</div><div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;}</div><div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;</div><div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160;{</div><div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;</div><div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;</div><div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div><div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;</div><div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div><div class="line"><a name="l10491"></a><span class="lineno">10491</span>&#160;}</div><div class="line"><a name="l10492"></a><span class="lineno">10492</span>&#160;</div><div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l10494"></a><span class="lineno">10494</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10495"></a><span class="lineno">10495</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;{</div><div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;</div><div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;</div><div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10505"></a><span class="lineno">10505</span>&#160;</div><div class="line"><a name="l10506"></a><span class="lineno">10506</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l10509"></a><span class="lineno">10509</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l10511"></a><span class="lineno">10511</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l10513"></a><span class="lineno">10513</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l10514"></a><span class="lineno">10514</span>&#160;        pAllocation);</div><div class="line"><a name="l10515"></a><span class="lineno">10515</span>&#160;</div><div class="line"><a name="l10516"></a><span class="lineno">10516</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10517"></a><span class="lineno">10517</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10518"></a><span class="lineno">10518</span>&#160;    {</div><div class="line"><a name="l10519"></a><span class="lineno">10519</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div><div class="line"><a name="l10520"></a><span class="lineno">10520</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;            *pVkMemoryRequirements,</div><div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;            *pAllocation);</div><div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;    }</div><div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;        </div><div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160;    {</div><div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;    }</div><div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;</div><div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10533"></a><span class="lineno">10533</span>&#160;}</div><div class="line"><a name="l10534"></a><span class="lineno">10534</span>&#160;</div><div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l10538"></a><span class="lineno">10538</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l10539"></a><span class="lineno">10539</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10541"></a><span class="lineno">10541</span>&#160;{</div><div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;</div><div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160;</div><div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;</div><div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;</div><div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;        vkMemReq,</div><div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l10558"></a><span class="lineno">10558</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l10561"></a><span class="lineno">10561</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l10562"></a><span class="lineno">10562</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l10563"></a><span class="lineno">10563</span>&#160;        pAllocation);</div><div class="line"><a name="l10564"></a><span class="lineno">10564</span>&#160;</div><div class="line"><a name="l10565"></a><span class="lineno">10565</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;    {</div><div class="line"><a name="l10568"></a><span class="lineno">10568</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div><div class="line"><a name="l10569"></a><span class="lineno">10569</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;            vkMemReq,</div><div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l10573"></a><span class="lineno">10573</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l10574"></a><span class="lineno">10574</span>&#160;            *pAllocation);</div><div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;    }</div><div class="line"><a name="l10576"></a><span class="lineno">10576</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;</div><div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l10579"></a><span class="lineno">10579</span>&#160;    {</div><div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;    }</div><div class="line"><a name="l10582"></a><span class="lineno">10582</span>&#160;</div><div class="line"><a name="l10583"></a><span class="lineno">10583</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;}</div><div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;</div><div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;    VkImage image,</div><div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;{</div><div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;</div><div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;</div><div class="line"><a name="l10597"></a><span class="lineno">10597</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10598"></a><span class="lineno">10598</span>&#160;</div><div class="line"><a name="l10599"></a><span class="lineno">10599</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;</div><div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;        vkMemReq,</div><div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l10611"></a><span class="lineno">10611</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l10613"></a><span class="lineno">10613</span>&#160;        pAllocation);</div><div class="line"><a name="l10614"></a><span class="lineno">10614</span>&#160;</div><div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10616"></a><span class="lineno">10616</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10617"></a><span class="lineno">10617</span>&#160;    {</div><div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div><div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;            vkMemReq,</div><div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;            *pAllocation);</div><div class="line"><a name="l10625"></a><span class="lineno">10625</span>&#160;    }</div><div class="line"><a name="l10626"></a><span class="lineno">10626</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;</div><div class="line"><a name="l10628"></a><span class="lineno">10628</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;    {</div><div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;    }</div><div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;</div><div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;}</div><div class="line"><a name="l10635"></a><span class="lineno">10635</span>&#160;</div><div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;{</div><div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160;    </div><div class="line"><a name="l10642"></a><span class="lineno">10642</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10643"></a><span class="lineno">10643</span>&#160;    {</div><div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;    }</div><div class="line"><a name="l10646"></a><span class="lineno">10646</span>&#160;    </div><div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;    </div><div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;</div><div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;    {</div><div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div><div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10656"></a><span class="lineno">10656</span>&#160;            allocation);</div><div class="line"><a name="l10657"></a><span class="lineno">10657</span>&#160;    }</div><div class="line"><a name="l10658"></a><span class="lineno">10658</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10659"></a><span class="lineno">10659</span>&#160;    </div><div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;    allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;}</div><div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;</div><div class="line"><a name="l10663"></a><span class="lineno">10663</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l10666"></a><span class="lineno">10666</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160;{</div><div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l10669"></a><span class="lineno">10669</span>&#160;</div><div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;</div><div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10674"></a><span class="lineno">10674</span>&#160;    {</div><div class="line"><a name="l10675"></a><span class="lineno">10675</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div><div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;            allocation);</div><div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;    }</div><div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160;</div><div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;}</div><div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;</div><div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;{</div><div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;</div><div class="line"><a name="l10690"></a><span class="lineno">10690</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10691"></a><span class="lineno">10691</span>&#160;</div><div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160;    {</div><div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div><div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;            allocation);</div><div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;    }</div><div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;</div><div class="line"><a name="l10701"></a><span class="lineno">10701</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l10702"></a><span class="lineno">10702</span>&#160;}</div><div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;</div><div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10706"></a><span class="lineno">10706</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l10707"></a><span class="lineno">10707</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l10708"></a><span class="lineno">10708</span>&#160;{</div><div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;</div><div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;</div><div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160;</div><div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;    {</div><div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div><div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;            allocation,</div><div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;            pUserData);</div><div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;    }</div><div class="line"><a name="l10723"></a><span class="lineno">10723</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;}</div><div class="line"><a name="l10725"></a><span class="lineno">10725</span>&#160;</div><div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;{</div><div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l10731"></a><span class="lineno">10731</span>&#160;</div><div class="line"><a name="l10732"></a><span class="lineno">10732</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;</div><div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;</div><div class="line"><a name="l10736"></a><span class="lineno">10736</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10737"></a><span class="lineno">10737</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10738"></a><span class="lineno">10738</span>&#160;    {</div><div class="line"><a name="l10739"></a><span class="lineno">10739</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div><div class="line"><a name="l10740"></a><span class="lineno">10740</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10741"></a><span class="lineno">10741</span>&#160;            *pAllocation);</div><div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160;    }</div><div class="line"><a name="l10743"></a><span class="lineno">10743</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;}</div><div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;</div><div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l10747"></a><span class="lineno">10747</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10748"></a><span class="lineno">10748</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160;{</div><div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;</div><div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;</div><div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;</div><div class="line"><a name="l10757"></a><span class="lineno">10757</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10759"></a><span class="lineno">10759</span>&#160;    {</div><div class="line"><a name="l10760"></a><span class="lineno">10760</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div><div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10762"></a><span class="lineno">10762</span>&#160;            allocation);</div><div class="line"><a name="l10763"></a><span class="lineno">10763</span>&#160;    }</div><div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;</div><div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;}</div><div class="line"><a name="l10768"></a><span class="lineno">10768</span>&#160;</div><div class="line"><a name="l10769"></a><span class="lineno">10769</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;{</div><div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l10774"></a><span class="lineno">10774</span>&#160;</div><div class="line"><a name="l10775"></a><span class="lineno">10775</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;</div><div class="line"><a name="l10777"></a><span class="lineno">10777</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10778"></a><span class="lineno">10778</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;    {</div><div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div><div class="line"><a name="l10781"></a><span class="lineno">10781</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;            allocation);</div><div class="line"><a name="l10783"></a><span class="lineno">10783</span>&#160;    }</div><div class="line"><a name="l10784"></a><span class="lineno">10784</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;</div><div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;}</div><div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;</div><div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;{</div><div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l10792"></a><span class="lineno">10792</span>&#160;</div><div class="line"><a name="l10793"></a><span class="lineno">10793</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div><div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;</div><div class="line"><a name="l10795"></a><span class="lineno">10795</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10796"></a><span class="lineno">10796</span>&#160;</div><div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div><div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;</div><div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;    {</div><div class="line"><a name="l10802"></a><span class="lineno">10802</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div><div class="line"><a name="l10803"></a><span class="lineno">10803</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;    }</div><div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;}</div><div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;</div><div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l10810"></a><span class="lineno">10810</span>&#160;{</div><div class="line"><a name="l10811"></a><span class="lineno">10811</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l10812"></a><span class="lineno">10812</span>&#160;</div><div class="line"><a name="l10813"></a><span class="lineno">10813</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div><div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;</div><div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;</div><div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div><div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;</div><div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;    {</div><div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div><div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;    }</div><div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10827"></a><span class="lineno">10827</span>&#160;}</div><div class="line"><a name="l10828"></a><span class="lineno">10828</span>&#160;</div><div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div><div class="line"><a name="l10830"></a><span class="lineno">10830</span>&#160;{</div><div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;</div><div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div><div class="line"><a name="l10834"></a><span class="lineno">10834</span>&#160;</div><div class="line"><a name="l10835"></a><span class="lineno">10835</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160;</div><div class="line"><a name="l10837"></a><span class="lineno">10837</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div><div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160;}</div><div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;</div><div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l10841"></a><span class="lineno">10841</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;{</div><div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocations);</div><div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;</div><div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragment&quot;</span>);</div><div class="line"><a name="l10851"></a><span class="lineno">10851</span>&#160;</div><div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;</div><div class="line"><a name="l10854"></a><span class="lineno">10854</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);</div><div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160;}</div><div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;</div><div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;{</div><div class="line"><a name="l10862"></a><span class="lineno">10862</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l10863"></a><span class="lineno">10863</span>&#160;</div><div class="line"><a name="l10864"></a><span class="lineno">10864</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;</div><div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160;</div><div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, buffer);</div><div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;}</div><div class="line"><a name="l10870"></a><span class="lineno">10870</span>&#160;</div><div class="line"><a name="l10871"></a><span class="lineno">10871</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l10872"></a><span class="lineno">10872</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10873"></a><span class="lineno">10873</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;    VkImage image)</div><div class="line"><a name="l10875"></a><span class="lineno">10875</span>&#160;{</div><div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;</div><div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l10879"></a><span class="lineno">10879</span>&#160;</div><div class="line"><a name="l10880"></a><span class="lineno">10880</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;</div><div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, image);</div><div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;}</div><div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;</div><div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l10891"></a><span class="lineno">10891</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160;{</div><div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160;    </div><div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;    </div><div class="line"><a name="l10897"></a><span class="lineno">10897</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l10898"></a><span class="lineno">10898</span>&#160;</div><div class="line"><a name="l10899"></a><span class="lineno">10899</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10900"></a><span class="lineno">10900</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;</div><div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l10904"></a><span class="lineno">10904</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l10906"></a><span class="lineno">10906</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l10907"></a><span class="lineno">10907</span>&#160;        pBuffer);</div><div class="line"><a name="l10908"></a><span class="lineno">10908</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;    {</div><div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l10911"></a><span class="lineno">10911</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l10912"></a><span class="lineno">10912</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l10914"></a><span class="lineno">10914</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l10915"></a><span class="lineno">10915</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;</div><div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;        <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;        <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l10919"></a><span class="lineno">10919</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div><div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160;        {</div><div class="line"><a name="l10921"></a><span class="lineno">10921</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l10923"></a><span class="lineno">10923</span>&#160;        }</div><div class="line"><a name="l10924"></a><span class="lineno">10924</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;        {</div><div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;        }</div><div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;        {</div><div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160;        }</div><div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;</div><div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;            vkMemReq,</div><div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l10942"></a><span class="lineno">10942</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l10943"></a><span class="lineno">10943</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l10944"></a><span class="lineno">10944</span>&#160;            pAllocation);</div><div class="line"><a name="l10945"></a><span class="lineno">10945</span>&#160;</div><div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;        {</div><div class="line"><a name="l10949"></a><span class="lineno">10949</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div><div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;                *pBufferCreateInfo,</div><div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;                *pAllocation);</div><div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;        }</div><div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;</div><div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;        {</div><div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;            res = allocator-&gt;BindBufferMemory(*pAllocation, *pBuffer);</div><div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160;            {</div><div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div><div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l10968"></a><span class="lineno">10968</span>&#160;                {</div><div class="line"><a name="l10969"></a><span class="lineno">10969</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;                }</div><div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;</div><div class="line"><a name="l10972"></a><span class="lineno">10972</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10973"></a><span class="lineno">10973</span>&#160;            }</div><div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l10975"></a><span class="lineno">10975</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10977"></a><span class="lineno">10977</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10978"></a><span class="lineno">10978</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;        }</div><div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;    }</div><div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10985"></a><span class="lineno">10985</span>&#160;}</div><div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;</div><div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;{</div><div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;</div><div class="line"><a name="l10994"></a><span class="lineno">10994</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160;    {</div><div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160;    }</div><div class="line"><a name="l10998"></a><span class="lineno">10998</span>&#160;</div><div class="line"><a name="l10999"></a><span class="lineno">10999</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;</div><div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;</div><div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l11005"></a><span class="lineno">11005</span>&#160;    {</div><div class="line"><a name="l11006"></a><span class="lineno">11006</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div><div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;            allocation);</div><div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;    }</div><div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l11011"></a><span class="lineno">11011</span>&#160;</div><div class="line"><a name="l11012"></a><span class="lineno">11012</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;    {</div><div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;    }</div><div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;</div><div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;    {</div><div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;    }</div><div class="line"><a name="l11021"></a><span class="lineno">11021</span>&#160;}</div><div class="line"><a name="l11022"></a><span class="lineno">11022</span>&#160;</div><div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l11027"></a><span class="lineno">11027</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l11028"></a><span class="lineno">11028</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;{</div><div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l11032"></a><span class="lineno">11032</span>&#160;</div><div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;</div><div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l11036"></a><span class="lineno">11036</span>&#160;</div><div class="line"><a name="l11037"></a><span class="lineno">11037</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;</div><div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l11043"></a><span class="lineno">11043</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l11044"></a><span class="lineno">11044</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;        pImage);</div><div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l11047"></a><span class="lineno">11047</span>&#160;    {</div><div class="line"><a name="l11048"></a><span class="lineno">11048</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l11049"></a><span class="lineno">11049</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l11050"></a><span class="lineno">11050</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;        </div><div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l11053"></a><span class="lineno">11053</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div><div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;</div><div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;            vkMemReq,</div><div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;            suballocType,</div><div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;            pAllocation);</div><div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;</div><div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160;        {</div><div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div><div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l11074"></a><span class="lineno">11074</span>&#160;                *pImageCreateInfo,</div><div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l11076"></a><span class="lineno">11076</span>&#160;                *pAllocation);</div><div class="line"><a name="l11077"></a><span class="lineno">11077</span>&#160;        }</div><div class="line"><a name="l11078"></a><span class="lineno">11078</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l11079"></a><span class="lineno">11079</span>&#160;</div><div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l11081"></a><span class="lineno">11081</span>&#160;        {</div><div class="line"><a name="l11082"></a><span class="lineno">11082</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;            res = allocator-&gt;BindImageMemory(*pAllocation, *pImage);</div><div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;            {</div><div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div><div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;                {</div><div class="line"><a name="l11092"></a><span class="lineno">11092</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l11093"></a><span class="lineno">11093</span>&#160;                }</div><div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;</div><div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11096"></a><span class="lineno">11096</span>&#160;            }</div><div class="line"><a name="l11097"></a><span class="lineno">11097</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11102"></a><span class="lineno">11102</span>&#160;        }</div><div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160;    }</div><div class="line"><a name="l11107"></a><span class="lineno">11107</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11108"></a><span class="lineno">11108</span>&#160;}</div><div class="line"><a name="l11109"></a><span class="lineno">11109</span>&#160;</div><div class="line"><a name="l11110"></a><span class="lineno">11110</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160;    VkImage image,</div><div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;{</div><div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;</div><div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;    {</div><div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;    }</div><div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;</div><div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;</div><div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;</div><div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;    {</div><div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div><div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;            allocation);</div><div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;    }</div><div class="line"><a name="l11133"></a><span class="lineno">11133</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l11134"></a><span class="lineno">11134</span>&#160;</div><div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;    {</div><div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;    }</div><div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;    {</div><div class="line"><a name="l11141"></a><span class="lineno">11141</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l11142"></a><span class="lineno">11142</span>&#160;    }</div><div class="line"><a name="l11143"></a><span class="lineno">11143</span>&#160;}</div><div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;</div><div class="line"><a name="l11145"></a><span class="lineno">11145</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div><div class="ttc" id="struct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1345</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdoc">Set this flag if the allocation should have its own memory block. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1658</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1300</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1414</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a6aced90fcc7b39882b6654a740a0b9bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a></div><div class="ttdeci">VkResult vmaDefragment(VmaAllocator allocator, VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const VmaDefragmentationInfo *pDefragmentationInfo, VmaDefragmentationStats *pDefragmentationStats)</div><div class="ttdoc">Compacts memory by moving allocations. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0d0eb0c1102268fa9a476d12ecbe4006"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a></div><div class="ttdeci">void vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Invalidates memory of given allocation. </div></div>
 <div class="ttc" id="struct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1283</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1376</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1357</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a3104eb30d8122c84dd8541063f145288"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a></div><div class="ttdeci">void vmaFreeStatsString(VmaAllocator allocator, char *pStatsString)</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a732be855fb4a7c248e6853d928a729af"><div class="ttname"><a href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a></div><div class="ttdeci">struct VmaStats VmaStats</div><div class="ttdoc">General statistics from current state of Allocator. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1494</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1275</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1883</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1297</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2128</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1713</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1615</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1349</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2004</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1411</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2249</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1834</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a1f0c126759fc96ccb6e2d23c101d770c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="ttdeci">#define VMA_RECORDING_ENABLED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1388</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a736bd6cbda886f36c891727e73bd4024"><div class="ttname"><a href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a></div><div class="ttdeci">void vmaMakePoolAllocationsLost(VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)</div><div class="ttdoc">Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1767</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1574</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1264</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1612</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1521</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1309</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1888</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1695</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1338</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1733</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1642</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1423</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a333b61c1788cb23559177531e6a93ca3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a></div><div class="ttdeci">void vmaCalculateStats(VmaAllocator allocator, VmaStats *pStats)</div><div class="ttdoc">Retrieves statistics from current state of the Allocator. </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null if you leave define VMA_STATIC_VULKAN_FUNCTIONS 1...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1362</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1294</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null if you leave define VMA_STATIC_VULKAN_FUNCTIONS 1...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1476</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1408</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1525</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1646</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1427</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1280</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1426</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2132</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1548</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1354</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1547</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2253</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a11f0fbc034fa81a4efedd73d61ce7568"><div class="ttname"><a href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage(). </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1326</div></div>
-<div class="ttc" id="struct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1436</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2140</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1596</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2123</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1281</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ab6a6477cda1ce775b30bde96d766203b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1206</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1440</div></div>
+<div class="ttc" id="struct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1557</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2261</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1717</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2244</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1355</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ab6a6477cda1ce775b30bde96d766203b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1280</div></div>
 <div class="ttc" id="struct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized. </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1303</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1417</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation. </div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1721</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1715</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1893</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1842</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1836</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_ace2aa4877b16a42b0b7673d4e26000ee"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo::pRecordSettings</a></div><div class="ttdeci">const VmaRecordSettings * pRecordSettings</div><div class="ttdoc">Parameters for recording of VMA calls. Can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1483</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2014</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1276</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1633</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1737</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1773</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1350</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a></div><div class="ttdoc">Enables flush after recording every function call. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1374</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1754</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1858</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1894</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a97064a1a271b0061ebfc3a079862d0c5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a></div><div class="ttdeci">struct VmaVulkanFunctions VmaVulkanFunctions</div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1262</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1724</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1336</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1845</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aef15a94b58fbcb0fe706d5720e84a74a"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndex(VmaAllocator allocator, uint32_t memoryTypeBits, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1472</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1593</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a795e6ff02a21d5486c0565f403dd9255"><div class="ttname"><a href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a></div><div class="ttdeci">struct VmaAllocationInfo VmaAllocationInfo</div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_abc34ee6f021f459aff885f3758c435de"><div class="ttname"><a href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a></div><div class="ttdeci">void vmaFlushAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Flushes memory of given allocation. </div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2118</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2239</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a211706e9348dcee25a843ed4ea69bce7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a></div><div class="ttdeci">struct VmaPoolCreateInfo VmaPoolCreateInfo</div><div class="ttdoc">Describes parameter of created VmaPool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory. </div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2136</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1511</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1620</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1279</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2257</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1632</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1741</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1353</div></div>
 <div class="ttc" id="struct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae8bf76997b234ef68aad922616df4153"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a></div><div class="ttdeci">void vmaGetPoolStats(VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)</div><div class="ttdoc">Retrieves statistics of existing VmaPool object. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae67f8573a0cf20f16f0a1eecbca566a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a></div><div class="ttdeci">struct VmaDefragmentationInfo VmaDefragmentationInfo</div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div></div>
-<div class="ttc" id="struct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1432</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called before vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1212</div></div>
+<div class="ttc" id="struct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1553</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called before vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1286</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_af9147d31ffc11d62fc187bde283ed14f"><div class="ttname"><a href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a></div><div class="ttdeci">void vmaSetAllocationUserData(VmaAllocator allocator, VmaAllocation allocation, void *pUserData)</div><div class="ttdoc">Sets pUserData in given allocation to new value. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1233</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1307</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a810b009a788ee8aac72a25b42ffbe31c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a></div><div class="ttdeci">struct VmaStatInfo VmaStatInfo</div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1238</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2138</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_af3929a1a4547c592fc0b0e55ef452828"><div class="ttname"><a href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></div><div class="ttdeci">VkFlags VmaRecordFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1378</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1312</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2259</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae5c9657d9e94756269145b01c05d16f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a></div><div class="ttdeci">void vmaCreateLostAllocation(VmaAllocator allocator, VmaAllocation *pAllocation)</div><div class="ttdoc">Creates new allocation that is in lost state from the beginning. </div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1607</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1783</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1728</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1904</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aa4fee7eb5253377599ef4fd38c93c2a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a></div><div class="ttdeci">void vmaBuildStatsString(VmaAllocator allocator, char **ppStatsString, VkBool32 detailedMap)</div><div class="ttdoc">Builds and returns statistics as string in JSON format. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1272</div></div>
-<div class="ttc" id="struct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1415</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1732</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1225</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1346</div></div>
+<div class="ttc" id="struct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1536</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1853</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1299</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1581</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1428</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1229</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1727</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1520</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1278</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1702</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1549</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1303</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1848</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1641</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1352</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a2e5612d871d64c5624087b837a338c34"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a></div><div class="ttdeci">struct VmaPoolStats VmaPoolStats</div><div class="ttdoc">Describes parameter of existing VmaPool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer(). </div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1602</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1593</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1723</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1714</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a088da83d8eaf3ce9056d9ea0b981d472"><div class="ttname"><a href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForImageInfo(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="struct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1418</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1274</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1745</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1312</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1776</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1591</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1626</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1539</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1348</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1866</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1426</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1897</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1712</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1747</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ab88db292a17974f911182543fda52d19"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a></div><div class="ttdeci">void vmaGetMemoryProperties(VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1350</div></div>
-<div class="ttc" id="struct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1434</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1561</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1427</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1464</div></div>
+<div class="ttc" id="struct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1555</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1682</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1548</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1285</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1227</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1284</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1359</div></div>
+<div class="ttc" id="struct_vma_record_settings_html_ad8fdcc92119ae7a8c08c1a564c01d63a"><div class="ttname"><a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings::flags</a></div><div class="ttdeci">VmaRecordFlags flags</div><div class="ttdoc">Flags for recording. Use VmaRecordFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1396</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1301</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1358</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it. </div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1759</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1277</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1880</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1351</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0faa3f9e5fb233d29d1e00390650febb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForImage(VmaAllocator allocator, VkImage image, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaAllocateMemoryForBuffer(). </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae0f6d1d733dded220d28134da46b4283"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a></div><div class="ttdeci">struct VmaAllocatorCreateInfo VmaAllocatorCreateInfo</div><div class="ttdoc">Description of a Allocator to be created. </div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1907</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1306</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1427</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1424</div></div>
+<div class="ttc" id="struct_vma_record_settings_html_a6cb1fdbf6bcb610b68f2010dd629e89d"><div class="ttname"><a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings::pFilePath</a></div><div class="ttdeci">const char * pFilePath</div><div class="ttdoc">Path to the file that should be written by the recording. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1404</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2028</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1420</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1548</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1545</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5e2eb68d727cfd4df25702b027b7aa31"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a></div><div class="ttdeci">struct VmaDeviceMemoryCallbacks VmaDeviceMemoryCallbacks</div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a49329a7f030dafcf82f7b73334c22e98"><div class="ttname"><a href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a></div><div class="ttdeci">VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory types (in both default and cust...</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1764</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1885</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ad535935619c7a549bf837e1bb0068f89"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a></div><div class="ttdeci">VkResult vmaCheckPoolCorruption(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory pool in search for corruptions...</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1888</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1589</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2134</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1270</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2009</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1710</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2255</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1344</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object. </div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1422</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1477</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1717</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1543</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1598</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1838</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aecabf7b6e91ea87d0316fa0a9e014fe0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a></div><div class="ttdeci">void vmaGetPhysicalDeviceProperties(VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1420</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1282</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1286</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1548</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1504</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1902</div></div>
+<div class="ttc" id="struct_vma_record_settings_html"><div class="ttname"><a href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1393</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1541</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1356</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1360</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1669</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1625</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2023</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae50d2cb3b4a3bfd4dd40987234e50e7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a></div><div class="ttdeci">void vmaDestroyImage(VmaAllocator allocator, VkImage image, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan image and frees allocated memory. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1260</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1334</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ab0f9b06441c840fee560de4a2967f8c9"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a></div><div class="ttdeci">struct VmaDefragmentationStats VmaDefragmentationStats</div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1273</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1869</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1347</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1990</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ade56bf8dc9f5a5eaddf5f119ed525236"><div class="ttname"><a href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a></div><div class="ttdeci">void vmaSetCurrentFrameIndex(VmaAllocator allocator, uint32_t frameIndex)</div><div class="ttdoc">Sets index of the current frame. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a86c44f9950b40d50088ed93a17870a7a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a></div><div class="ttdeci">struct VmaAllocationCreateInfo VmaAllocationCreateInfo</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a7fdf64415b6c3d83c454f28d2c53df7b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForBuffer(VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1695</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1428</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1816</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1549</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1587</div></div>
-<div class="ttc" id="struct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1435</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1708</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></div><div class="ttdeci">VmaRecordFlagBits</div><div class="ttdoc">Flags to be used in VmaRecordSettings::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1368</div></div>
+<div class="ttc" id="struct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1556</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory. </div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1770</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1428</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1874</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1891</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1549</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a0ab61e87ff6365f1d59915eadc37a9f0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a></div><div class="ttdeci">struct VmaRecordSettings VmaRecordSettings</div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1995</div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/premake/premake5.lua b/premake/premake5.lua
index 8893601..c6d2b93 100644
--- a/premake/premake5.lua
+++ b/premake/premake5.lua
@@ -12,7 +12,7 @@
 filter "platforms:x64"

 system "Windows"

 architecture "x64"

-includedirs { "../third_party/mathfu-1.1.0/include", "$(VULKAN_SDK)/Include" }

+includedirs { "$(VULKAN_SDK)/Include" }

 libdirs { "$(VULKAN_SDK)/Lib" }

 

 filter "platforms:Linux-x64"

@@ -21,6 +21,7 @@
 includedirs { "$(VULKAN_SDK)/include" }

 libdirs { "$(VULKAN_SDK)/lib" }

 

+

 project "VulkanSample"

 kind "ConsoleApp"

 language "C++"

@@ -57,3 +58,41 @@
 

 filter { "configurations:Release", "platforms:Windows-x64" }

 buildoptions { "/MD" }

+

+

+project "VmaReplay"

+kind "ConsoleApp"

+language "C++"

+location "../build"

+filename ("VmaReplay_" .. _SUFFIX)

+targetdir "../bin"

+objdir "../build/Desktop_%{_SUFFIX}/%{cfg.platform}/%{cfg.buildcfg}"

+floatingpoint "Fast"

+files { "../src/VmaReplay/*.h", "../src/VmaReplay/*.cpp" }

+flags { "NoPCH", "FatalWarnings" }

+characterset "Default"

+

+filter "configurations:Debug"

+defines { "_DEBUG", "DEBUG" }

+flags { }

+targetsuffix ("_Debug_" .. _SUFFIX)

+

+filter "configurations:Release"

+defines { "NDEBUG" }

+optimize "On"

+flags { "LinkTimeOptimization" }

+targetsuffix ("_Release_" .. _SUFFIX)

+

+filter { "platforms:x64" }

+defines { "WIN32", "_CONSOLE", "PROFILE", "_WINDOWS", "_WIN32_WINNT=0x0601" }

+links { "vulkan-1" }

+

+filter { "platforms:Linux-x64" }

+buildoptions { "-std=c++0x" }

+links { "vulkan" }

+

+filter { "configurations:Debug", "platforms:x64" }

+buildoptions { "/MDd" }

+

+filter { "configurations:Release", "platforms:Windows-x64" }

+buildoptions { "/MD" }

diff --git a/src/VmaReplay/Common.cpp b/src/VmaReplay/Common.cpp
new file mode 100644
index 0000000..c324245
--- /dev/null
+++ b/src/VmaReplay/Common.cpp
@@ -0,0 +1,670 @@
+#include "Common.h"

+

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

+// LineSplit class

+

+bool LineSplit::GetNextLine(StrRange& out)

+{

+    if(m_NextLineBeg < m_NumBytes)

+    {

+        out.beg = m_Data + m_NextLineBeg;

+        size_t currLineEnd = m_NextLineBeg;

+        while(currLineEnd < m_NumBytes && m_Data[currLineEnd] != '\n')

+            ++currLineEnd;

+        out.end = m_Data + currLineEnd;

+        m_NextLineBeg = currLineEnd + 1; // Past '\n'

+        ++m_NextLineIndex;

+        return true;

+    }

+    else

+        return false;

+}

+

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

+// CsvSplit class

+

+void CsvSplit::Set(const StrRange& line, size_t maxCount)

+{

+    assert(maxCount <= RANGE_COUNT_MAX);

+    m_Line = line;

+    const size_t strLen = line.length();

+    size_t rangeIndex = 0;

+    size_t charIndex = 0;

+    while(charIndex < strLen && rangeIndex < maxCount)

+    {

+        m_Ranges[rangeIndex * 2] = charIndex;

+        while(charIndex < strLen && (rangeIndex + 1 == maxCount || m_Line.beg[charIndex] != ','))

+            ++charIndex;

+        m_Ranges[rangeIndex * 2 + 1] = charIndex;

+        ++rangeIndex;

+        ++charIndex; // Past ','

+    }

+    m_Count = rangeIndex;

+}

+

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

+// class CmdLineParser

+

+bool CmdLineParser::ReadNextArg(std::string *OutArg)

+{

+	if (m_argv != NULL)

+	{

+		if (m_ArgIndex >= (size_t)m_argc) return false;

+

+		*OutArg = m_argv[m_ArgIndex];

+		m_ArgIndex++;

+		return true;

+	}

+	else

+	{

+		if (m_ArgIndex >= m_CmdLineLength) return false;

+		

+		OutArg->clear();

+		bool InsideQuotes = false;

+		while (m_ArgIndex < m_CmdLineLength)

+		{

+			char Ch = m_CmdLine[m_ArgIndex];

+			if (Ch == '\\')

+			{

+				bool FollowedByQuote = false;

+				size_t BackslashCount = 1;

+				size_t TmpIndex = m_ArgIndex + 1;

+				while (TmpIndex < m_CmdLineLength)

+				{

+					char TmpCh = m_CmdLine[TmpIndex];

+					if (TmpCh == '\\')

+					{

+						BackslashCount++;

+						TmpIndex++;

+					}

+					else if (TmpCh == '"')

+					{

+						FollowedByQuote = true;

+						break;

+					}

+					else

+						break;

+				}

+

+				if (FollowedByQuote)

+				{

+					if (BackslashCount % 2 == 0)

+					{

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

+							*OutArg += '\\';

+						m_ArgIndex += BackslashCount + 1;

+						InsideQuotes = !InsideQuotes;

+					}

+					else

+					{

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

+							*OutArg += '\\';

+						*OutArg += '"';

+						m_ArgIndex += BackslashCount + 1;

+					}

+				}

+				else

+				{

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

+						*OutArg += '\\';

+					m_ArgIndex += BackslashCount;

+				}

+			}

+			else if (Ch == '"')

+			{

+				InsideQuotes = !InsideQuotes;

+				m_ArgIndex++;

+			}

+			else if (isspace(Ch))

+			{

+				if (InsideQuotes)

+				{

+					*OutArg += Ch;

+					m_ArgIndex++;

+				}

+				else

+				{

+					m_ArgIndex++;

+					break;

+				}

+			}

+			else

+			{

+				*OutArg += Ch;

+				m_ArgIndex++;

+			}

+		}

+

+		while (m_ArgIndex < m_CmdLineLength && isspace(m_CmdLine[m_ArgIndex]))

+			m_ArgIndex++;

+

+		return true;

+	}

+}

+

+CmdLineParser::SHORT_OPT * CmdLineParser::FindShortOpt(char Opt)

+{

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

+		if (m_ShortOpts[i].Opt == Opt)

+			return &m_ShortOpts[i];

+	return NULL;

+}

+

+CmdLineParser::LONG_OPT * CmdLineParser::FindLongOpt(const std::string &Opt)

+{

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

+		if (m_LongOpts[i].Opt == Opt)

+			return &m_LongOpts[i];

+	return NULL;

+}

+

+CmdLineParser::CmdLineParser(int argc, char **argv) :

+	m_argv(argv),

+	m_CmdLine(NULL),

+	m_argc(argc),

+	m_CmdLineLength(0),

+	m_ArgIndex(1),

+	m_InsideMultioption(false),

+	m_LastArgIndex(0),

+	m_LastOptId(0)

+{

+	assert(argc > 0);

+	assert(argv != NULL);

+}

+

+CmdLineParser::CmdLineParser(const char *CmdLine) :

+	m_argv(NULL),

+	m_CmdLine(CmdLine),

+	m_argc(0),

+	m_ArgIndex(0),

+	m_InsideMultioption(false),

+	m_LastArgIndex(0),

+	m_LastOptId(0)

+{

+	assert(CmdLine != NULL);

+

+	m_CmdLineLength = strlen(m_CmdLine);

+

+	while (m_ArgIndex < m_CmdLineLength && isspace(m_CmdLine[m_ArgIndex]))

+		m_ArgIndex++;

+}

+

+void CmdLineParser::RegisterOpt(uint32_t Id, char Opt, bool Parameter)

+{

+	assert(Opt != '\0');

+

+	m_ShortOpts.push_back(SHORT_OPT(Id, Opt, Parameter));

+}

+

+void CmdLineParser::RegisterOpt(uint32_t Id, const std::string &Opt, bool Parameter)

+{

+	assert(!Opt.empty());

+	

+	m_LongOpts.push_back(LONG_OPT(Id, Opt, Parameter));

+}

+

+CmdLineParser::RESULT CmdLineParser::ReadNext()

+{

+	if (m_InsideMultioption)

+	{

+		assert(m_LastArgIndex < m_LastArg.length());

+		SHORT_OPT *so = FindShortOpt(m_LastArg[m_LastArgIndex]);

+		if (so == NULL)

+		{

+			m_LastOptId = 0;

+			m_LastParameter.clear();

+			return CmdLineParser::RESULT_ERROR;

+		}

+		if (so->Parameter)

+		{

+			if (m_LastArg.length() == m_LastArgIndex+1)

+			{

+				if (!ReadNextArg(&m_LastParameter))

+				{

+					m_LastOptId = 0;

+					m_LastParameter.clear();

+					return CmdLineParser::RESULT_ERROR;

+				}

+				m_InsideMultioption = false;

+				m_LastOptId = so->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+			else if (m_LastArg[m_LastArgIndex+1] == '=')

+			{

+				m_InsideMultioption = false;

+				m_LastParameter = m_LastArg.substr(m_LastArgIndex+2);

+				m_LastOptId = so->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+			else

+			{

+				m_InsideMultioption = false;

+				m_LastParameter = m_LastArg.substr(m_LastArgIndex+1);

+				m_LastOptId = so->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+		}

+		else

+		{

+			if (m_LastArg.length() == m_LastArgIndex+1)

+			{

+				m_InsideMultioption = false;

+				m_LastParameter.clear();

+				m_LastOptId = so->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+			else

+			{

+				m_LastArgIndex++;

+

+				m_LastParameter.clear();

+				m_LastOptId = so->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+		}

+	}

+	else

+	{

+		if (!ReadNextArg(&m_LastArg))

+		{

+			m_LastParameter.clear();

+			m_LastOptId = 0;

+			return CmdLineParser::RESULT_END;

+		}

+		

+		if (!m_LastArg.empty() && m_LastArg[0] == '-')

+		{

+			if (m_LastArg.length() > 1 && m_LastArg[1] == '-')

+			{

+				size_t EqualIndex = m_LastArg.find('=', 2);

+				if (EqualIndex != std::string::npos)

+				{

+					LONG_OPT *lo = FindLongOpt(m_LastArg.substr(2, EqualIndex-2));

+					if (lo == NULL || lo->Parameter == false)

+					{

+						m_LastOptId = 0;

+						m_LastParameter.clear();

+						return CmdLineParser::RESULT_ERROR;

+					}

+					m_LastParameter = m_LastArg.substr(EqualIndex+1);

+					m_LastOptId = lo->Id;

+					return CmdLineParser::RESULT_OPT;

+				}

+				else

+				{

+					LONG_OPT *lo = FindLongOpt(m_LastArg.substr(2));

+					if (lo == NULL)

+					{

+						m_LastOptId = 0;

+						m_LastParameter.clear();

+						return CmdLineParser::RESULT_ERROR;

+					}

+					if (lo->Parameter)

+					{

+						if (!ReadNextArg(&m_LastParameter))

+						{

+							m_LastOptId = 0;

+							m_LastParameter.clear();

+							return CmdLineParser::RESULT_ERROR;

+						}

+					}

+					else

+						m_LastParameter.clear();

+					m_LastOptId = lo->Id;

+					return CmdLineParser::RESULT_OPT;

+				}

+			}

+			else

+			{

+				if (m_LastArg.length() < 2)

+				{

+					m_LastOptId = 0;

+					m_LastParameter.clear();

+					return CmdLineParser::RESULT_ERROR;

+				}

+				SHORT_OPT *so = FindShortOpt(m_LastArg[1]);

+				if (so == NULL)

+				{

+					m_LastOptId = 0;

+					m_LastParameter.clear();

+					return CmdLineParser::RESULT_ERROR;

+				}

+				if (so->Parameter)

+				{

+					if (m_LastArg.length() == 2)

+					{

+						if (!ReadNextArg(&m_LastParameter))

+						{

+							m_LastOptId = 0;

+							m_LastParameter.clear();

+							return CmdLineParser::RESULT_ERROR;

+						}

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+					else if (m_LastArg[2] == '=')

+					{

+						m_LastParameter = m_LastArg.substr(3);

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+					else

+					{

+						m_LastParameter = m_LastArg.substr(2);

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+				}

+				else

+				{

+					if (m_LastArg.length() == 2)

+					{

+						m_LastParameter.clear();

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+					else

+					{

+						m_InsideMultioption = true;

+						m_LastArgIndex = 2;

+

+						m_LastParameter.clear();

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+				}

+			}

+		}

+		else if (!m_LastArg.empty() && m_LastArg[0] == '/')

+		{

+			size_t EqualIndex = m_LastArg.find('=', 1);

+			if (EqualIndex != std::string::npos)

+			{

+				if (EqualIndex == 2)

+				{

+					SHORT_OPT *so = FindShortOpt(m_LastArg[1]);

+					if (so != NULL)

+					{

+						if (so->Parameter == false)	

+						{

+							m_LastOptId = 0;

+							m_LastParameter.clear();

+							return CmdLineParser::RESULT_ERROR;

+						}

+						m_LastParameter = m_LastArg.substr(EqualIndex+1);

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+				}

+				LONG_OPT *lo = FindLongOpt(m_LastArg.substr(1, EqualIndex-1));

+				if (lo == NULL || lo->Parameter == false)

+				{

+					m_LastOptId = 0;

+					m_LastParameter.clear();

+					return CmdLineParser::RESULT_ERROR;

+				}

+				m_LastParameter = m_LastArg.substr(EqualIndex+1);

+				m_LastOptId = lo->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+			else

+			{

+				if (m_LastArg.length() == 2)

+				{

+					SHORT_OPT *so = FindShortOpt(m_LastArg[1]);

+					if (so != NULL)

+					{

+						if (so->Parameter)

+						{

+							if (!ReadNextArg(&m_LastParameter))

+							{

+								m_LastOptId = 0;

+								m_LastParameter.clear();

+								return CmdLineParser::RESULT_ERROR;

+							}

+						}

+						else

+							m_LastParameter.clear();

+						m_LastOptId = so->Id;

+						return CmdLineParser::RESULT_OPT;

+					}

+				}

+				LONG_OPT *lo = FindLongOpt(m_LastArg.substr(1));

+				if (lo == NULL)

+				{

+					m_LastOptId = 0;

+					m_LastParameter.clear();

+					return CmdLineParser::RESULT_ERROR;

+				}

+				if (lo->Parameter)

+				{

+					if (!ReadNextArg(&m_LastParameter))

+					{

+						m_LastOptId = 0;

+						m_LastParameter.clear();

+						return CmdLineParser::RESULT_ERROR;

+					}

+				}

+				else

+					m_LastParameter.clear();

+				m_LastOptId = lo->Id;

+				return CmdLineParser::RESULT_OPT;

+			}

+		}

+		else

+		{

+			m_LastOptId = 0;

+			m_LastParameter = m_LastArg;

+			return CmdLineParser::RESULT_PARAMETER;

+		}

+	}

+}

+

+uint32_t CmdLineParser::GetOptId()

+{

+	return m_LastOptId;

+}

+

+const std::string & CmdLineParser::GetParameter()

+{

+	return m_LastParameter;

+}

+

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

+// Glolals

+

+/*

+

+void SetConsoleColor(CONSOLE_COLOR color)

+{

+    WORD attr = 0;

+    switch(color)

+    {

+    case CONSOLE_COLOR::INFO:

+        attr = FOREGROUND_INTENSITY;;

+        break;

+    case CONSOLE_COLOR::NORMAL:

+        attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;

+        break;

+    case CONSOLE_COLOR::WARNING:

+        attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;

+        break;

+    case CONSOLE_COLOR::ERROR_:

+        attr = FOREGROUND_RED | FOREGROUND_INTENSITY;

+        break;

+    default:

+        assert(0);

+    }

+

+    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

+    SetConsoleTextAttribute(out, attr);

+}

+

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

+{

+    if(color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(color);

+    

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

+    

+    if (color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(CONSOLE_COLOR::NORMAL);

+}

+

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

+{

+    if(color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(color);

+    

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

+    

+    if (color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(CONSOLE_COLOR::NORMAL);

+}

+

+static const size_t CONSOLE_SMALL_BUF_SIZE = 256;

+

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

+{

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

+	if(dstLen)

+	{

+		bool useSmallBuf = dstLen < CONSOLE_SMALL_BUF_SIZE;

+		char smallBuf[CONSOLE_SMALL_BUF_SIZE];

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

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

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

+		PrintMessage(color, bufPtr);

+	}

+}

+

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

+{

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

+	if(dstLen)

+	{

+		bool useSmallBuf = dstLen < CONSOLE_SMALL_BUF_SIZE;

+		wchar_t smallBuf[CONSOLE_SMALL_BUF_SIZE];

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

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

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

+		PrintMessage(color, bufPtr);

+	}

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(color, format, argList);

+	va_end(argList);

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(color, format, argList);

+	va_end(argList);

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

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

+	va_end(argList);

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

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

+	va_end(argList);

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

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

+	va_end(argList);

+}

+

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

+{

+	va_list argList;

+	va_start(argList, format);

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

+	va_end(argList);

+}

+*/

+

+void SecondsToFriendlyStr(float seconds, std::string& out)

+{

+    if(seconds == 0.f)

+    {

+        out = "0";

+        return;

+    }

+

+    if (seconds < 0.f)

+	{

+		out = "-";

+        seconds = -seconds;

+	}

+	else

+	{

+		out.clear();

+	}

+

+	char s[32];

+

+    // #.### ns

+    if(seconds < 1e-6)

+    {

+        sprintf_s(s, "%.3f ns", seconds * 1e9);

+        out += s;

+    }

+    // #.### us

+    else if(seconds < 1e-3)

+    {

+        sprintf_s(s, "%.3f us", seconds * 1e6);

+        out += s;

+    }

+    // #.### ms

+    else if(seconds < 1.f)

+    {

+        sprintf_s(s, "%.3f ms", seconds * 1e3);

+        out += s;

+    }

+    // #.### s

+    else if(seconds < 60.f)

+    {

+        sprintf_s(s, "%.3f s", seconds);

+        out += s;

+    }

+    else

+    {

+	    uint64_t seconds_u = (uint64_t)seconds;

+	    // "#:## min"

+	    if (seconds_u < 3600)

+	    {

+		    uint64_t minutes = seconds_u / 60;

+		    seconds_u -= minutes * 60;

+            sprintf_s(s, "%llu:%02llu min", minutes, seconds_u);

+            out += s;

+	    }

+	    // "#:##:## h"

+	    else

+	    {

+		    uint64_t minutes = seconds_u / 60;

+            seconds_u -= minutes * 60;

+		    uint64_t hours = minutes / 60;

+		    minutes -= hours * 60;

+            sprintf_s(s, "%llu:%02llu:%02llu h", hours, minutes, seconds_u);

+            out += s;

+	    }

+    }

+}

diff --git a/src/VmaReplay/Common.h b/src/VmaReplay/Common.h
new file mode 100644
index 0000000..28b5bbc
--- /dev/null
+++ b/src/VmaReplay/Common.h
@@ -0,0 +1,391 @@
+#pragma once

+

+#include "VmaUsage.h"

+

+#include <iostream>

+#include <fstream>

+#include <vector>

+#include <memory>

+#include <algorithm>

+#include <numeric>

+#include <array>

+#include <type_traits>

+#include <utility>

+#include <chrono>

+#include <string>

+#include <limits>

+

+#include <cassert>

+#include <cstdlib>

+#include <cstdio>

+#include <cstdarg>

+

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

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

+

+inline float ToFloatSeconds(duration d)

+{

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

+}

+

+void SecondsToFriendlyStr(float seconds, std::string& out);

+

+template <typename T>

+T ceil_div(T x, T y)

+{

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

+}

+

+template <typename T>

+inline T align_up(T val, T align)

+{

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

+}

+

+struct StrRange

+{

+    const char* beg;

+    const char* end;

+

+    StrRange() { }

+    StrRange(const char* beg, const char* end) : beg(beg), end(end) { }

+    explicit StrRange(const char* sz) : beg(sz), end(sz + strlen(sz)) { }

+    explicit StrRange(const std::string& s) : beg(s.data()), end(s.data() + s.length()) { }

+

+    size_t length() const { return end - beg; }

+    void to_str(std::string& out) const { out.assign(beg, end); }

+};

+

+inline bool StrRangeEq(const StrRange& lhs, const char* rhsSz)

+{

+    const size_t rhsLen = strlen(rhsSz);

+    return rhsLen == lhs.length() &&

+        memcmp(lhs.beg, rhsSz, rhsLen) == 0;

+}

+

+inline bool StrRangeToUint(const StrRange& s, uint32_t& out)

+{

+    char* end = (char*)s.end;

+    out = (uint32_t)strtoul(s.beg, &end, 10);

+    return end == s.end;

+}

+inline bool StrRangeToUint(const StrRange& s, uint64_t& out)

+{

+    char* end = (char*)s.end;

+    out = (uint64_t)strtoull(s.beg, &end, 10);

+    return end == s.end;

+}

+inline bool StrRangeToPtr(const StrRange& s, uint64_t& out)

+{

+    char* end = (char*)s.end;

+    out = (uint64_t)strtoull(s.beg, &end, 16);

+    return end == s.end;

+}

+inline bool StrRangeToFloat(const StrRange& s, float& out)

+{

+    char* end = (char*)s.end;

+    out = strtof(s.beg, &end);

+    return end == s.end;

+}

+inline bool StrRangeToBool(const StrRange& s, bool& out)

+{

+    if(s.end - s.beg == 1)

+    {

+        if(*s.beg == '1')

+        {

+            out = true;

+        }

+        else if(*s.beg == '0')

+        {

+            out = false;

+        }

+        else

+        {

+            return false;

+        }

+    }

+    else

+    {

+        return false;

+    }

+

+    return true;

+}

+

+class LineSplit

+{

+public:

+    LineSplit(const char* data, size_t numBytes) :

+        m_Data(data),

+        m_NumBytes(numBytes),

+        m_NextLineBeg(0),

+        m_NextLineIndex(0)

+    {

+    }

+

+    bool GetNextLine(StrRange& out);

+    size_t GetNextLineIndex() const { return m_NextLineIndex; }

+

+private:

+    const char* const m_Data;

+    const size_t m_NumBytes;

+    size_t m_NextLineBeg;

+    size_t m_NextLineIndex;

+};

+

+class CsvSplit

+{

+public:

+    static const size_t RANGE_COUNT_MAX = 32;

+

+    void Set(const StrRange& line, size_t maxCount = RANGE_COUNT_MAX);

+

+    const StrRange& GetLine() const { return m_Line; }

+

+    size_t GetCount() const { return m_Count; }

+    StrRange GetRange(size_t index) const 

+    {

+        return StrRange {

+            m_Line.beg + m_Ranges[index * 2],

+            m_Line.beg + m_Ranges[index * 2 + 1] };

+    }

+

+private:

+    StrRange m_Line = { nullptr, nullptr };

+    size_t m_Count = 0;

+    size_t m_Ranges[RANGE_COUNT_MAX * 2]; // Pairs of begin-end.

+};

+

+class CmdLineParser

+{

+public:

+	enum RESULT

+	{

+		RESULT_OPT,

+		RESULT_PARAMETER,

+		RESULT_END,

+		RESULT_ERROR,

+	};

+

+	CmdLineParser(int argc, char **argv);

+	CmdLineParser(const char *CmdLine);

+	

+    void RegisterOpt(uint32_t Id, char Opt, bool Parameter);

+	void RegisterOpt(uint32_t Id, const std::string &Opt, bool Parameter);

+	

+    RESULT ReadNext();

+	uint32_t GetOptId();

+	const std::string & GetParameter();

+

+private:

+	struct SHORT_OPT

+	{

+		uint32_t Id;

+		char Opt;

+		bool Parameter;

+

+		SHORT_OPT(uint32_t Id, char Opt, bool Parameter) : Id(Id), Opt(Opt), Parameter(Parameter) { }

+	};

+

+	struct LONG_OPT

+	{

+		uint32_t Id;

+		std::string Opt;

+		bool Parameter;

+

+		LONG_OPT(uint32_t Id, std::string Opt, bool Parameter) : Id(Id), Opt(Opt), Parameter(Parameter) { }

+	};

+

+	char **m_argv;

+	const char *m_CmdLine;

+	int m_argc;

+	size_t m_CmdLineLength;

+	size_t m_ArgIndex;

+

+	bool ReadNextArg(std::string *OutArg);

+

+	std::vector<SHORT_OPT> m_ShortOpts;

+	std::vector<LONG_OPT> m_LongOpts;

+

+	SHORT_OPT * FindShortOpt(char Opt);

+	LONG_OPT * FindLongOpt(const std::string &Opt);

+

+	bool m_InsideMultioption;

+	std::string m_LastArg;

+	size_t m_LastArgIndex;

+	uint32_t m_LastOptId;

+	std::string m_LastParameter;

+};

+

+/*

+Parses and stores a sequence of ranges.

+

+Upper range is inclusive.

+

+Examples:

+

+    "1" -> [ {1, 1} ]

+    "1,10" -> [ {1, 1}, {10, 10} ]

+    "2-6" -> [ {2, 6} ]

+    "-8" -> [ {MIN, 8} ]

+    "12-" -> [ {12, MAX} ]

+    "1-10,12,15-" -> [ {1, 10}, {12, 12}, {15, MAX} ]

+

+TODO: Optimize it: Do sorting and merging while parsing. Do binary search while

+reading.

+*/

+template<typename T>

+class RangeSequence

+{

+public:

+    typedef std::pair<T, T> RangeType;

+

+    void Clear() { m_Ranges.clear(); }

+    bool Parse(const StrRange& str);

+

+    bool IsEmpty() const { return m_Ranges.empty(); }

+    size_t GetCount() const { return m_Ranges.size(); }

+    const RangeType* GetRanges() const { return m_Ranges.data(); }

+

+    bool Includes(T number) const;

+    

+private:

+    std::vector<RangeType> m_Ranges;

+};

+

+template<typename T>

+bool RangeSequence<T>::Parse(const StrRange& str)

+{

+    m_Ranges.clear();

+

+    StrRange currRange = { str.beg, str.beg };

+    while(currRange.beg < str.end)

+    {

+        currRange.end = currRange.beg + 1;

+        // Find next ',' or the end.

+        while(currRange.end < str.end && *currRange.end != ',')

+        {

+            ++currRange.end;

+        }

+

+        // Find '-' within this range.

+        const char* hyphenPos = currRange.beg;

+        while(hyphenPos < currRange.end && *hyphenPos != '-')

+        {

+            ++hyphenPos;

+        }

+

+        // No hyphen - single number like '10'.

+        if(hyphenPos == currRange.end)

+        {

+            RangeType range;

+            if(!StrRangeToUint(currRange, range.first))

+            {

+                return false;

+            }

+            range.second = range.first;

+            m_Ranges.push_back(range);

+        }

+        // Hyphen at the end, like '10-'.

+        else if(hyphenPos + 1 == currRange.end)

+        {

+            const StrRange numberRange = { currRange.beg, hyphenPos };

+            RangeType range;

+            if(!StrRangeToUint(numberRange, range.first))

+            {

+                return false;

+            }

+            range.second = std::numeric_limits<T>::max();

+            m_Ranges.push_back(range);

+        }

+        // Hyphen at the beginning, like "-10".

+        else if(hyphenPos == currRange.beg)

+        {

+            const StrRange numberRange = { currRange.beg + 1, currRange.end };

+            RangeType range;

+            range.first = std::numeric_limits<T>::min();

+            if(!StrRangeToUint(numberRange, range.second))

+            {

+                return false;

+            }

+            m_Ranges.push_back(range);

+        }

+        // Hyphen in the middle, like "1-10".

+        else

+        {

+            const StrRange numberRange1 = { currRange.beg, hyphenPos };

+            const StrRange numberRange2 = { hyphenPos + 1, currRange.end };

+            RangeType range;

+            if(!StrRangeToUint(numberRange1, range.first) ||

+                !StrRangeToUint(numberRange2, range.second) ||

+                range.second < range.first)

+            {

+                return false;

+            }

+            m_Ranges.push_back(range);

+        }

+

+        // Skip ','

+        currRange.beg = currRange.end + 1;

+    }

+

+    return true;

+}

+

+template<typename T>

+bool RangeSequence<T>::Includes(T number) const

+{

+    for(const auto& it : m_Ranges)

+    {

+        if(number >= it.first && number <= it.second)

+        {

+            return true;

+        }

+    }

+    return false;

+}

+

+/*

+class RandomNumberGenerator

+{

+public:

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

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

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

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

+

+private:

+    uint32_t m_Value;

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

+};

+

+enum class CONSOLE_COLOR

+{

+    INFO,

+    NORMAL,

+    WARNING,

+    ERROR_,

+    COUNT

+};

+

+void SetConsoleColor(CONSOLE_COLOR color);

+

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

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

+

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

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

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

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

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

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

+

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

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

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

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

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

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

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

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

+*/

diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp
new file mode 100644
index 0000000..9635b03
--- /dev/null
+++ b/src/VmaReplay/VmaReplay.cpp
@@ -0,0 +1,3000 @@
+//

+// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.

+//

+// Permission is hereby granted, free of charge, to any person obtaining a copy

+// of this software and associated documentation files (the "Software"), to deal

+// in the Software without restriction, including without limitation the rights

+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

+// copies of the Software, and to permit persons to whom the Software is

+// furnished to do so, subject to the following conditions:

+//

+// The above copyright notice and this permission notice shall be included in

+// all copies or substantial portions of the Software.

+//

+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE

+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

+// THE SOFTWARE.

+//

+

+#include "VmaUsage.h"

+#include "Common.h"

+#include <unordered_map>

+

+static const int RESULT_EXCEPTION          = -1000;

+static const int RESULT_ERROR_COMMAND_LINE = -1;

+static const int RESULT_ERROR_SOURCE_FILE  = -2;

+static const int RESULT_ERROR_FORMAT       = -3;

+static const int RESULT_ERROR_VULKAN       = -4;

+

+enum CMD_LINE_OPT

+{

+    CMD_LINE_OPT_VERBOSITY,

+    CMD_LINE_OPT_ITERATIONS,

+    CMD_LINE_OPT_LINES,

+    CMD_LINE_OPT_PHYSICAL_DEVICE,

+    CMD_LINE_OPT_USER_DATA,

+    CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION,

+    CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION,

+    CMD_LINE_OPT_MEM_STATS,

+    CMD_LINE_OPT_DUMP_STATS_AFTER_LINE,

+    CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE,

+};

+

+static enum class VERBOSITY

+{

+    MINIMUM = 0,

+    DEFAULT,

+    MAXIMUM,

+    COUNT,

+} g_Verbosity = VERBOSITY::DEFAULT;

+

+enum class VULKAN_EXTENSION_REQUEST

+{

+    DISABLED,

+    ENABLED,

+    DEFAULT

+};

+

+enum class OBJECT_TYPE { BUFFER, IMAGE };

+

+enum class VMA_FUNCTION

+{

+    CreatePool,

+    DestroyPool,

+    SetAllocationUserData,

+    CreateBuffer,

+    DestroyBuffer,

+    CreateImage,

+    DestroyImage,

+    FreeMemory,

+    CreateLostAllocation,

+    AllocateMemory,

+    AllocateMemoryForBuffer,

+    AllocateMemoryForImage,

+    MapMemory,

+    UnmapMemory,

+    FlushAllocation,

+    InvalidateAllocation,

+    TouchAllocation,

+    GetAllocationInfo,

+    MakePoolAllocationsLost,

+    Count

+};

+static const char* VMA_FUNCTION_NAMES[] = {

+    "vmaCreatePool",

+    "vmaDestroyPool",

+    "vmaSetAllocationUserData",

+    "vmaCreateBuffer",

+    "vmaDestroyBuffer",

+    "vmaCreateImage",

+    "vmaDestroyImage",

+    "vmaFreeMemory",

+    "vmaCreateLostAllocation",

+    "vmaAllocateMemory",

+    "vmaAllocateMemoryForBuffer",

+    "vmaAllocateMemoryForImage",

+    "vmaMapMemory",

+    "vmaUnmapMemory",

+    "vmaFlushAllocation",

+    "vmaInvalidateAllocation",

+    "vmaTouchAllocation",

+    "vmaGetAllocationInfo",

+    "vmaMakePoolAllocationsLost",

+};

+static_assert(

+    _countof(VMA_FUNCTION_NAMES) == (size_t)VMA_FUNCTION::Count,

+    "VMA_FUNCTION_NAMES array doesn't match VMA_FUNCTION enum.");

+

+// Set this to false to disable deleting leaked VmaAllocation, VmaPool objects

+// and let VMA report asserts about them.

+static const bool CLEANUP_LEAKED_OBJECTS = true;

+

+static std::string g_FilePath;

+// Most significant 16 bits are major version, least significant 16 bits are minor version.

+static uint32_t g_FileVersion;

+

+inline uint32_t MakeVersion(uint32_t major, uint32_t minor) { return (major << 16) | minor; }

+inline uint32_t GetVersionMajor(uint32_t version) { return version >> 16; }

+inline uint32_t GetVersionMinor(uint32_t version) { return version & 0xFFFF; }

+

+static size_t g_IterationCount = 1;

+static uint32_t g_PhysicalDeviceIndex = 0;

+static RangeSequence<size_t> g_LineRanges;

+static bool g_UserDataEnabled = true;

+static bool g_MemStatsEnabled = false;

+VULKAN_EXTENSION_REQUEST g_VK_KHR_dedicated_allocation_request = VULKAN_EXTENSION_REQUEST::DEFAULT;

+VULKAN_EXTENSION_REQUEST g_VK_LAYER_LUNARG_standard_validation = VULKAN_EXTENSION_REQUEST::DEFAULT;

+

+struct StatsAfterLineEntry

+{

+    size_t line;

+    bool detailed;

+

+    bool operator<(const StatsAfterLineEntry& rhs) const { return line < rhs.line; }

+    bool operator==(const StatsAfterLineEntry& rhs) const { return line == rhs.line; }

+};

+static std::vector<StatsAfterLineEntry> g_DumpStatsAfterLine;

+static size_t g_DumpStatsAfterLineNextIndex = 0;

+

+static bool ValidateFileVersion()

+{

+    if(GetVersionMajor(g_FileVersion) == 1 &&

+        GetVersionMinor(g_FileVersion) <= 3)

+    {

+        return true;

+    }

+

+    return false;

+}

+

+static bool ParseFileVersion(const StrRange& s)

+{

+    CsvSplit csvSplit;

+    csvSplit.Set(s, 2);

+    uint32_t major, minor;

+    if(csvSplit.GetCount() == 2 &&

+        StrRangeToUint(csvSplit.GetRange(0), major) &&

+        StrRangeToUint(csvSplit.GetRange(1), minor))

+    {

+        g_FileVersion = (major << 16) | minor;

+        return true;

+    }

+    else

+    {

+        return false;

+    }

+}

+

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

+// class Statistics

+

+class Statistics

+{

+public:

+    static uint32_t BufferUsageToClass(uint32_t usage);

+    static uint32_t ImageUsageToClass(uint32_t usage);

+

+    Statistics();

+    void Init(uint32_t memHeapCount, uint32_t memTypeCount);

+    void PrintMemStats() const;

+

+    const size_t* GetFunctionCallCount() const { return m_FunctionCallCount; }

+    size_t GetImageCreationCount(uint32_t imgClass) const { return m_ImageCreationCount[imgClass]; }

+    size_t GetLinearImageCreationCount() const { return m_LinearImageCreationCount; }

+    size_t GetBufferCreationCount(uint32_t bufClass) const { return m_BufferCreationCount[bufClass]; }

+    size_t GetAllocationCreationCount() const { return m_AllocationCreationCount; }

+    size_t GetPoolCreationCount() const { return m_PoolCreationCount; }

+

+    void RegisterFunctionCall(VMA_FUNCTION func);

+    void RegisterCreateImage(uint32_t usage, uint32_t tiling);

+    void RegisterCreateBuffer(uint32_t usage);

+    void RegisterCreatePool();

+    void RegisterCreateAllocation();

+

+    void UpdateMemStats(const VmaStats& currStats);

+

+private:

+    uint32_t m_MemHeapCount = 0;

+    uint32_t m_MemTypeCount = 0;

+

+    size_t m_FunctionCallCount[(size_t)VMA_FUNCTION::Count] = {};

+    size_t m_ImageCreationCount[4] = { };

+    size_t m_LinearImageCreationCount = 0;

+    size_t m_BufferCreationCount[4] = { };

+    size_t m_AllocationCreationCount = 0; // Also includes buffers and images, and lost allocations.

+    size_t m_PoolCreationCount = 0;

+    

+    // Structure similar to VmaStatInfo, but not the same.

+    struct MemStatInfo

+    {

+        uint32_t blockCount;

+        uint32_t allocationCount;

+        uint32_t unusedRangeCount;

+        VkDeviceSize usedBytes;

+        VkDeviceSize unusedBytes;

+        VkDeviceSize totalBytes;

+    };

+    struct MemStats

+    {

+        MemStatInfo memoryType[VK_MAX_MEMORY_TYPES];

+        MemStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS];

+        MemStatInfo total;

+    } m_PeakMemStats;

+

+    void UpdateMemStatInfo(MemStatInfo& inoutPeakInfo, const VmaStatInfo& currInfo);

+    static void PrintMemStatInfo(const MemStatInfo& info);

+};

+

+uint32_t Statistics::BufferUsageToClass(uint32_t usage)

+{

+    // Buffer is used as source of data for fixed-function stage of graphics pipeline.

+    // It's indirect, vertex, or index buffer.

+    if ((usage & (VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |

+        VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |

+        VK_BUFFER_USAGE_INDEX_BUFFER_BIT)) != 0)

+    {

+        return 0;

+    }

+    // Buffer is accessed by shaders for load/store/atomic.

+    // Aka "UAV"

+    else if ((usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |

+        VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) != 0)

+    {

+        return 1;

+    }

+    // Buffer is accessed by shaders for reading uniform data.

+    // Aka "constant buffer"

+    else if ((usage & (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |

+    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) != 0)

+    {

+        return 2;

+    }

+    // Any other type of buffer.

+    // Notice that VK_BUFFER_USAGE_TRANSFER_SRC_BIT and VK_BUFFER_USAGE_TRANSFER_DST_BIT

+    // flags are intentionally ignored.

+    else

+    {

+        return 3;

+    }

+}

+

+uint32_t Statistics::ImageUsageToClass(uint32_t usage)

+{

+    // Image is used as depth/stencil "texture/surface".

+    if ((usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0)

+    {

+        return 0;

+    }

+    // Image is used as other type of attachment.

+    // Aka "render target"

+    else if ((usage & (VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |

+        VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT |

+        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) != 0)

+    {

+        return 1;

+    }

+    // Image is accessed by shaders for sampling.

+    // Aka "texture"

+    else if ((usage & VK_IMAGE_USAGE_SAMPLED_BIT) != 0)

+    {

+        return 2;

+    }

+    // Any other type of image.

+    // Notice that VK_IMAGE_USAGE_TRANSFER_SRC_BIT and VK_IMAGE_USAGE_TRANSFER_DST_BIT

+    // flags are intentionally ignored.

+    else

+    {

+        return 3;

+    }

+}

+

+Statistics::Statistics()

+{

+    ZeroMemory(&m_PeakMemStats, sizeof(m_PeakMemStats));

+}

+

+void Statistics::Init(uint32_t memHeapCount, uint32_t memTypeCount)

+{

+    m_MemHeapCount = memHeapCount;

+    m_MemTypeCount = memTypeCount;

+}

+

+void Statistics::PrintMemStats() const

+{

+    printf("Memory statistics:\n");

+

+    printf("    Total:\n");

+    PrintMemStatInfo(m_PeakMemStats.total);

+

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

+    {

+        const MemStatInfo& info = m_PeakMemStats.memoryHeap[i];

+        if(info.blockCount > 0 || info.totalBytes > 0)

+        {

+            printf("    Heap %u:\n", i);

+            PrintMemStatInfo(info);

+        }

+    }

+

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

+    {

+        const MemStatInfo& info = m_PeakMemStats.memoryType[i];

+        if(info.blockCount > 0 || info.totalBytes > 0)

+        {

+            printf("    Type %u:\n", i);

+            PrintMemStatInfo(info);

+        }

+    }

+}

+

+void Statistics::RegisterFunctionCall(VMA_FUNCTION func)

+{

+    ++m_FunctionCallCount[(size_t)func];

+}

+

+void Statistics::RegisterCreateImage(uint32_t usage, uint32_t tiling)

+{

+    if(tiling == VK_IMAGE_TILING_LINEAR)

+        ++m_LinearImageCreationCount;

+    else

+    {

+        const uint32_t imgClass = ImageUsageToClass(usage);

+        ++m_ImageCreationCount[imgClass];

+    }

+

+    ++m_AllocationCreationCount;

+}

+

+void Statistics::RegisterCreateBuffer(uint32_t usage)

+{

+    const uint32_t bufClass = BufferUsageToClass(usage);

+    ++m_BufferCreationCount[bufClass];

+

+    ++m_AllocationCreationCount;

+}

+

+void Statistics::RegisterCreatePool()

+{

+    ++m_PoolCreationCount;

+}

+

+void Statistics::RegisterCreateAllocation()

+{

+    ++m_AllocationCreationCount;

+}

+

+void Statistics::UpdateMemStats(const VmaStats& currStats)

+{

+    UpdateMemStatInfo(m_PeakMemStats.total, currStats.total);

+    

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

+    {

+        UpdateMemStatInfo(m_PeakMemStats.memoryHeap[i], currStats.memoryHeap[i]);

+    }

+

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

+    {

+        UpdateMemStatInfo(m_PeakMemStats.memoryType[i], currStats.memoryType[i]);

+    }

+}

+

+void Statistics::UpdateMemStatInfo(MemStatInfo& inoutPeakInfo, const VmaStatInfo& currInfo)

+{

+#define SET_PEAK(inoutDst, src) \

+    if((src) > (inoutDst)) \

+    { \

+        (inoutDst) = (src); \

+    }

+

+    SET_PEAK(inoutPeakInfo.blockCount, currInfo.blockCount);

+    SET_PEAK(inoutPeakInfo.allocationCount, currInfo.allocationCount);

+    SET_PEAK(inoutPeakInfo.unusedRangeCount, currInfo.unusedRangeCount);

+    SET_PEAK(inoutPeakInfo.usedBytes, currInfo.usedBytes);

+    SET_PEAK(inoutPeakInfo.unusedBytes, currInfo.unusedBytes);

+    SET_PEAK(inoutPeakInfo.totalBytes, currInfo.usedBytes + currInfo.unusedBytes);

+

+#undef SET_PEAK

+}

+

+void Statistics::PrintMemStatInfo(const MemStatInfo& info)

+{

+    printf("        Peak blocks %u, allocations %u, unused ranges %u\n",

+        info.blockCount,

+        info.allocationCount,

+        info.unusedRangeCount);

+    printf("        Peak total bytes %llu, used bytes %llu, unused bytes %llu\n",

+        info.totalBytes,

+        info.usedBytes,

+        info.unusedBytes);

+}

+

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

+// class ConfigurationParser

+

+class ConfigurationParser

+{

+public:

+    ConfigurationParser();

+    

+    bool Parse(LineSplit& lineSplit);

+

+    void Compare(

+        const VkPhysicalDeviceProperties& currDevProps,

+        const VkPhysicalDeviceMemoryProperties& currMemProps,

+        bool currDedicatedAllocationExtensionEnabled);

+

+private:

+    enum class OPTION

+    {

+        PhysicalDevice_apiVersion,

+        PhysicalDevice_driverVersion,

+        PhysicalDevice_vendorID,

+        PhysicalDevice_deviceID,

+        PhysicalDevice_deviceType,

+        PhysicalDevice_deviceName,

+        PhysicalDeviceLimits_maxMemoryAllocationCount,

+        PhysicalDeviceLimits_bufferImageGranularity,

+        PhysicalDeviceLimits_nonCoherentAtomSize,

+        Extension_VK_KHR_dedicated_allocation,

+        Macro_VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,

+        Macro_VMA_DEBUG_ALIGNMENT,

+        Macro_VMA_DEBUG_MARGIN,

+        Macro_VMA_DEBUG_INITIALIZE_ALLOCATIONS,

+        Macro_VMA_DEBUG_DETECT_CORRUPTION,

+        Macro_VMA_DEBUG_GLOBAL_MUTEX,

+        Macro_VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,

+        Macro_VMA_SMALL_HEAP_MAX_SIZE,

+        Macro_VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,

+        Count

+    };

+

+    std::vector<bool> m_OptionSet;

+    std::vector<std::string> m_OptionValue;

+    VkPhysicalDeviceMemoryProperties m_MemProps;

+

+    bool m_WarningHeaderPrinted = false;

+

+    void SetOption(

+        size_t lineNumber,

+        OPTION option,

+        const StrRange& str);

+    void EnsureWarningHeader();

+    void CompareOption(VERBOSITY minVerbosity, const char* name,

+        OPTION option, uint32_t currValue);

+    void CompareOption(VERBOSITY minVerbosity, const char* name,

+        OPTION option, uint64_t currValue);

+    void CompareOption(VERBOSITY minVerbosity, const char* name,

+        OPTION option, bool currValue);

+    void CompareOption(VERBOSITY minVerbosity, const char* name,

+        OPTION option, const char* currValue);

+    void CompareMemProps(

+        const VkPhysicalDeviceMemoryProperties& currMemProps);

+};

+

+ConfigurationParser::ConfigurationParser() :

+    m_OptionSet((size_t)OPTION::Count),

+    m_OptionValue((size_t)OPTION::Count)

+{

+    ZeroMemory(&m_MemProps, sizeof(m_MemProps));

+}

+

+bool ConfigurationParser::Parse(LineSplit& lineSplit)

+{

+    for(auto& it : m_OptionSet)

+    {

+        it = false;

+    }

+    for(auto& it : m_OptionValue)

+    {

+        it.clear();

+    }

+

+    StrRange line;

+

+    if(!lineSplit.GetNextLine(line) && !StrRangeEq(line, "Config,Begin"))

+    {

+        return false;

+    }

+

+    CsvSplit csvSplit;

+    while(lineSplit.GetNextLine(line))

+    {

+        if(StrRangeEq(line, "Config,End"))

+        {

+            break;

+        }

+

+        const size_t currLineNumber = lineSplit.GetNextLineIndex();

+

+        csvSplit.Set(line);

+        if(csvSplit.GetCount() == 0)

+        {

+            return false;

+        }

+

+        const StrRange optionName = csvSplit.GetRange(0);

+        if(StrRangeEq(optionName, "PhysicalDevice"))

+        {

+            if(csvSplit.GetCount() >= 3)

+            {

+                const StrRange subOptionName = csvSplit.GetRange(1);

+                if(StrRangeEq(subOptionName, "apiVersion"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_apiVersion, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "driverVersion"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_driverVersion, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "vendorID"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_vendorID, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "deviceID"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_deviceID, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "deviceType"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_deviceType, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "deviceName"))

+                    SetOption(currLineNumber, OPTION::PhysicalDevice_deviceName, StrRange(csvSplit.GetRange(2).beg, line.end));

+                else

+                    printf("Line %zu: Unrecognized configuration option.\n", currLineNumber);

+            }

+            else

+                printf("Line %zu: Too few columns.\n", currLineNumber);

+        }

+        else if(StrRangeEq(optionName, "PhysicalDeviceLimits"))

+        {

+            if(csvSplit.GetCount() >= 3)

+            {

+                const StrRange subOptionName = csvSplit.GetRange(1);

+                if(StrRangeEq(subOptionName, "maxMemoryAllocationCount"))

+                    SetOption(currLineNumber, OPTION::PhysicalDeviceLimits_maxMemoryAllocationCount, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "bufferImageGranularity"))

+                    SetOption(currLineNumber, OPTION::PhysicalDeviceLimits_bufferImageGranularity, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "nonCoherentAtomSize"))

+                    SetOption(currLineNumber, OPTION::PhysicalDeviceLimits_nonCoherentAtomSize, csvSplit.GetRange(2));

+                else

+                    printf("Line %zu: Unrecognized configuration option.\n", currLineNumber);

+            }

+            else

+                printf("Line %zu: Too few columns.\n", currLineNumber);

+        }

+        else if(StrRangeEq(optionName, "Extension"))

+        {

+            if(csvSplit.GetCount() >= 3)

+            {

+                const StrRange subOptionName = csvSplit.GetRange(1);

+                if(StrRangeEq(subOptionName, "VK_KHR_dedicated_allocation"))

+                    SetOption(currLineNumber, OPTION::Extension_VK_KHR_dedicated_allocation, csvSplit.GetRange(2));

+                else

+                    printf("Line %zu: Unrecognized configuration option.\n", currLineNumber);

+            }

+            else

+                printf("Line %zu: Too few columns.\n", currLineNumber);

+        }

+        else if(StrRangeEq(optionName, "Macro"))

+        {

+            if(csvSplit.GetCount() >= 3)

+            {

+                const StrRange subOptionName = csvSplit.GetRange(1);

+                if(StrRangeEq(subOptionName, "VMA_DEBUG_ALWAYS_DEDICATED_MEMORY"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_ALWAYS_DEDICATED_MEMORY, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_ALIGNMENT"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_ALIGNMENT, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_MARGIN"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_MARGIN, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_INITIALIZE_ALLOCATIONS"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_INITIALIZE_ALLOCATIONS, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_DETECT_CORRUPTION"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_DETECT_CORRUPTION, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_GLOBAL_MUTEX"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_GLOBAL_MUTEX, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_SMALL_HEAP_MAX_SIZE"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_SMALL_HEAP_MAX_SIZE, csvSplit.GetRange(2));

+                else if(StrRangeEq(subOptionName, "VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE"))

+                    SetOption(currLineNumber, OPTION::Macro_VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE, csvSplit.GetRange(2));

+                else

+                    printf("Line %zu: Unrecognized configuration option.\n", currLineNumber);

+            }

+            else

+                printf("Line %zu: Too few columns.\n", currLineNumber);

+        }

+        else if(StrRangeEq(optionName, "PhysicalDeviceMemory"))

+        {

+            uint32_t value = 0;

+            if(csvSplit.GetCount() == 3 && StrRangeEq(csvSplit.GetRange(1), "HeapCount") &&

+                StrRangeToUint(csvSplit.GetRange(2), value))

+            {

+                m_MemProps.memoryHeapCount = value;

+            }

+            else if(csvSplit.GetCount() == 3 && StrRangeEq(csvSplit.GetRange(1), "TypeCount") &&

+                StrRangeToUint(csvSplit.GetRange(2), value))

+            {

+                m_MemProps.memoryTypeCount = value;

+            }

+            else if(csvSplit.GetCount() == 5 && StrRangeEq(csvSplit.GetRange(1), "Heap") &&

+                StrRangeToUint(csvSplit.GetRange(2), value) &&

+                value < m_MemProps.memoryHeapCount)

+            {

+                if(StrRangeEq(csvSplit.GetRange(3), "size") &&

+                    StrRangeToUint(csvSplit.GetRange(4), m_MemProps.memoryHeaps[value].size))

+                {

+                     // Parsed.

+                }

+                else if(StrRangeEq(csvSplit.GetRange(3), "flags") &&

+                    StrRangeToUint(csvSplit.GetRange(4), m_MemProps.memoryHeaps[value].flags))

+                {

+                     // Parsed.

+                }

+                else

+                    printf("Line %zu: Invalid configuration option.\n", currLineNumber);

+            }

+            else if(csvSplit.GetCount() == 5 && StrRangeEq(csvSplit.GetRange(1), "Type") &&

+                StrRangeToUint(csvSplit.GetRange(2), value) &&

+                value < m_MemProps.memoryTypeCount)

+            {

+                if(StrRangeEq(csvSplit.GetRange(3), "heapIndex") &&

+                    StrRangeToUint(csvSplit.GetRange(4), m_MemProps.memoryTypes[value].heapIndex))

+                {

+                     // Parsed.

+                }

+                else if(StrRangeEq(csvSplit.GetRange(3), "propertyFlags") &&

+                    StrRangeToUint(csvSplit.GetRange(4), m_MemProps.memoryTypes[value].propertyFlags))

+                {

+                     // Parsed.

+                }

+                else

+                    printf("Line %zu: Invalid configuration option.\n", currLineNumber);

+            }

+            else

+                printf("Line %zu: Invalid configuration option.\n", currLineNumber);

+        }

+        else

+            printf("Line %zu: Unrecognized configuration option.\n", currLineNumber);

+    }

+

+    return true;

+}

+

+void ConfigurationParser::Compare(

+    const VkPhysicalDeviceProperties& currDevProps,

+    const VkPhysicalDeviceMemoryProperties& currMemProps,

+    bool currDedicatedAllocationExtensionEnabled)

+{

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice apiVersion",

+        OPTION::PhysicalDevice_apiVersion, currDevProps.apiVersion);

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice driverVersion",

+        OPTION::PhysicalDevice_driverVersion, currDevProps.driverVersion);

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice vendorID",

+        OPTION::PhysicalDevice_vendorID, currDevProps.vendorID);

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice deviceID",

+        OPTION::PhysicalDevice_deviceID, currDevProps.deviceID);

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice deviceType",

+        OPTION::PhysicalDevice_deviceType, (uint32_t)currDevProps.deviceType);

+    CompareOption(VERBOSITY::MAXIMUM, "PhysicalDevice deviceName",

+        OPTION::PhysicalDevice_deviceName, currDevProps.deviceName);

+

+    CompareOption(VERBOSITY::DEFAULT, "PhysicalDeviceLimits maxMemoryAllocationCount",

+        OPTION::PhysicalDeviceLimits_maxMemoryAllocationCount, currDevProps.limits.maxMemoryAllocationCount);

+    CompareOption(VERBOSITY::DEFAULT, "PhysicalDeviceLimits bufferImageGranularity",

+        OPTION::PhysicalDeviceLimits_bufferImageGranularity, currDevProps.limits.bufferImageGranularity);

+    CompareOption(VERBOSITY::DEFAULT, "PhysicalDeviceLimits nonCoherentAtomSize",

+        OPTION::PhysicalDeviceLimits_nonCoherentAtomSize, currDevProps.limits.nonCoherentAtomSize);

+    CompareOption(VERBOSITY::DEFAULT, "Extension VK_KHR_dedicated_allocation",

+        OPTION::Extension_VK_KHR_dedicated_allocation, currDedicatedAllocationExtensionEnabled);

+

+    CompareMemProps(currMemProps);

+}

+

+void ConfigurationParser::SetOption(

+    size_t lineNumber,

+    OPTION option,

+    const StrRange& str)

+{

+    if(m_OptionSet[(size_t)option])

+    {

+        printf("Line %zu: Option already specified.\n" ,lineNumber);

+    }

+

+    m_OptionSet[(size_t)option] = true;

+

+    std::string val;

+    str.to_str(val);

+    m_OptionValue[(size_t)option] = std::move(val);

+}

+

+void ConfigurationParser::EnsureWarningHeader()

+{

+    if(!m_WarningHeaderPrinted)

+    {

+        printf("WARNING: Following configuration parameters don't match:\n");

+        m_WarningHeaderPrinted = true;

+    }

+}

+

+void ConfigurationParser::CompareOption(VERBOSITY minVerbosity, const char* name,

+    OPTION option, uint32_t currValue)

+{

+    if(m_OptionSet[(size_t)option] &&

+        g_Verbosity >= minVerbosity)

+    {

+        uint32_t origValue;

+        if(StrRangeToUint(StrRange(m_OptionValue[(size_t)option]), origValue))

+        {

+            if(origValue != currValue)

+            {

+                EnsureWarningHeader();

+                printf("    %s: original %u, current %u\n", name, origValue, currValue);

+            }

+        }

+    }

+}

+

+void ConfigurationParser::CompareOption(VERBOSITY minVerbosity, const char* name,

+    OPTION option, uint64_t currValue)

+{

+    if(m_OptionSet[(size_t)option] &&

+        g_Verbosity >= minVerbosity)

+    {

+        uint64_t origValue;

+        if(StrRangeToUint(StrRange(m_OptionValue[(size_t)option]), origValue))

+        {

+            if(origValue != currValue)

+            {

+                EnsureWarningHeader();

+                printf("    %s: original %llu, current %llu\n", name, origValue, currValue);

+            }

+        }

+    }

+}

+

+void ConfigurationParser::CompareOption(VERBOSITY minVerbosity, const char* name,

+    OPTION option, bool currValue)

+{

+    if(m_OptionSet[(size_t)option] &&

+        g_Verbosity >= minVerbosity)

+    {

+        bool origValue;

+        if(StrRangeToBool(StrRange(m_OptionValue[(size_t)option]), origValue))

+        {

+            if(origValue != currValue)

+            {

+                EnsureWarningHeader();

+                printf("    %s: original %u, current %u\n", name,

+                    origValue ? 1 : 0,

+                    currValue ? 1 : 0);

+            }

+        }

+    }

+}

+

+void ConfigurationParser::CompareOption(VERBOSITY minVerbosity, const char* name,

+    OPTION option, const char* currValue)

+{

+    if(m_OptionSet[(size_t)option] &&

+        g_Verbosity >= minVerbosity)

+    {

+        const std::string& origValue = m_OptionValue[(size_t)option];

+        if(origValue != currValue)

+        {

+            EnsureWarningHeader();

+            printf("    %s: original \"%s\", current \"%s\"\n", name, origValue.c_str(), currValue);

+        }

+    }

+}

+

+void ConfigurationParser::CompareMemProps(

+    const VkPhysicalDeviceMemoryProperties& currMemProps)

+{

+    if(g_Verbosity < VERBOSITY::DEFAULT)

+    {

+        return;

+    }

+

+    bool memoryMatch =

+        currMemProps.memoryHeapCount == m_MemProps.memoryHeapCount &&

+        currMemProps.memoryTypeCount == m_MemProps.memoryTypeCount;

+

+    for(uint32_t i = 0; memoryMatch && i < currMemProps.memoryHeapCount; ++i)

+    {

+        memoryMatch =

+            currMemProps.memoryHeaps[i].flags == m_MemProps.memoryHeaps[i].flags;

+    }

+    for(uint32_t i = 0; memoryMatch && i < currMemProps.memoryTypeCount; ++i)

+    {

+        memoryMatch =

+            currMemProps.memoryTypes[i].heapIndex == m_MemProps.memoryTypes[i].heapIndex &&

+            currMemProps.memoryTypes[i].propertyFlags == m_MemProps.memoryTypes[i].propertyFlags;

+    }

+

+    if(memoryMatch && g_Verbosity == VERBOSITY::MAXIMUM)

+    {

+        bool memorySizeMatch = true;

+        for(uint32_t i = 0; memorySizeMatch && i < currMemProps.memoryHeapCount; ++i)

+        {

+            memorySizeMatch =

+                currMemProps.memoryHeaps[i].size == m_MemProps.memoryHeaps[i].size;

+        }

+

+        if(!memorySizeMatch)

+        {

+            printf("WARNING: Sizes of original memory heaps are different from current ones.\n");

+        }

+    }

+    else

+    {

+        printf("WARNING: Layout of original memory heaps and types is different from current one.\n");

+    }

+}

+

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

+// class Player

+

+static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation";

+

+static bool g_MemoryAliasingWarningEnabled = true;

+

+static VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback(

+    VkDebugReportFlagsEXT flags,

+    VkDebugReportObjectTypeEXT objectType,

+    uint64_t object,

+    size_t location,

+    int32_t messageCode,

+    const char* pLayerPrefix,

+    const char* pMessage,

+    void* pUserData)

+{

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

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

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

+    {

+        return VK_FALSE;

+    }

+

+    // Ignoring because when VK_KHR_dedicated_allocation extension is enabled,

+    // vkGetBufferMemoryRequirements2KHR function is used instead, while Validation

+    // Layer seems to be unaware of it.

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

+    {

+        return VK_FALSE;

+    }

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

+    {

+        return VK_FALSE;

+    }

+    

+    /*

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

+    Ignoring because we map entire VkDeviceMemory blocks, where different types of

+    images and buffers may end up together, especially on GPUs with unified memory

+    like Intel.

+    */

+    if(strstr(pMessage, "Mapping an image with layout") != nullptr &&

+        strstr(pMessage, "can result in undefined behavior if this memory is used by the device") != nullptr)

+    {

+        return VK_FALSE;

+    }

+

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

+

+    return VK_FALSE;

+}

+

+static bool IsLayerSupported(const VkLayerProperties* pProps, size_t propCount, const char* pLayerName)

+{

+    const VkLayerProperties* propsEnd = pProps + propCount;

+    return std::find_if(

+        pProps,

+        propsEnd,

+        [pLayerName](const VkLayerProperties& prop) -> bool {

+            return strcmp(pLayerName, prop.layerName) == 0;

+        }) != propsEnd;

+}

+

+static const size_t FIRST_PARAM_INDEX = 4;

+

+static void InitVulkanFeatures(

+    VkPhysicalDeviceFeatures& outFeatures,

+    const VkPhysicalDeviceFeatures& supportedFeatures)

+{

+    ZeroMemory(&outFeatures, sizeof(outFeatures));

+

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

+

+    outFeatures.fullDrawIndexUint32 = supportedFeatures.fullDrawIndexUint32;

+    outFeatures.imageCubeArray = supportedFeatures.imageCubeArray;

+    outFeatures.geometryShader = supportedFeatures.geometryShader;

+    outFeatures.tessellationShader = supportedFeatures.tessellationShader;

+    outFeatures.multiDrawIndirect = supportedFeatures.multiDrawIndirect;

+    outFeatures.textureCompressionETC2 = supportedFeatures.textureCompressionETC2;

+    outFeatures.textureCompressionASTC_LDR = supportedFeatures.textureCompressionASTC_LDR;

+    outFeatures.textureCompressionBC = supportedFeatures.textureCompressionBC;

+}

+

+class Player

+{

+public:

+    Player();

+    int Init();

+    ~Player();

+

+    void ApplyConfig(ConfigurationParser& configParser);

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

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

+

+    void PrintStats();

+

+private:

+    static const size_t MAX_WARNINGS_TO_SHOW = 64;

+

+    size_t m_WarningCount = 0;

+    bool m_AllocateForBufferImageWarningIssued = false;

+

+    VkInstance m_VulkanInstance = VK_NULL_HANDLE;

+    VkPhysicalDevice m_PhysicalDevice = VK_NULL_HANDLE;

+    uint32_t m_GraphicsQueueFamilyIndex = UINT_MAX;

+    VkDevice m_Device = VK_NULL_HANDLE;

+    VmaAllocator m_Allocator = VK_NULL_HANDLE;

+    bool m_DedicatedAllocationEnabled = false;

+    const VkPhysicalDeviceProperties* m_DevProps = nullptr;

+    const VkPhysicalDeviceMemoryProperties* m_MemProps = nullptr;

+

+    PFN_vkCreateDebugReportCallbackEXT m_pvkCreateDebugReportCallbackEXT;

+    PFN_vkDebugReportMessageEXT m_pvkDebugReportMessageEXT;

+    PFN_vkDestroyDebugReportCallbackEXT m_pvkDestroyDebugReportCallbackEXT;

+    VkDebugReportCallbackEXT m_hCallback;

+

+    uint32_t m_VmaFrameIndex = 0;

+

+    // Any of these handles null can mean it was created in original but couldn't be created now.

+    struct Pool

+    {

+        VmaPool pool;

+    };

+    struct Allocation

+    {

+        uint32_t allocationFlags;

+        VmaAllocation allocation;

+        VkBuffer buffer;

+        VkImage image;

+    };

+    std::unordered_map<uint64_t, Pool> m_Pools;

+    std::unordered_map<uint64_t, Allocation> m_Allocations;

+

+    struct Thread

+    {

+        uint32_t callCount;

+    };

+    std::unordered_map<uint32_t, Thread> m_Threads;

+

+    // Copy of column [1] from previously parsed line.

+    std::string m_LastLineTimeStr;

+    Statistics m_Stats;

+

+    std::vector<char> m_UserDataTmpStr;

+

+    void Destroy(const Allocation& alloc);

+

+    // Finds VmaPool bu original pointer.

+    // If origPool = null, returns true and outPool = null.

+    // If failed, prints warning, returns false and outPool = null.

+    bool FindPool(size_t lineNumber, uint64_t origPool, VmaPool& outPool);

+    // If allocation with that origPtr already exists, prints warning and replaces it.

+    void AddAllocation(size_t lineNumber, uint64_t origPtr, VkResult res, const char* functionName, Allocation&& allocDesc);

+

+    // Increments warning counter. Returns true if warning message should be printed.

+    bool IssueWarning();

+

+    int InitVulkan();

+    void FinalizeVulkan();

+    void RegisterDebugCallbacks();

+

+    // If parmeter count doesn't match, issues warning and returns false.

+    bool ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound);

+

+    // If failed, prints warning, returns false, and sets allocCreateInfo.pUserData to null.

+    bool PrepareUserData(size_t lineNumber, uint32_t allocCreateFlags, const StrRange& userDataColumn, const StrRange& wholeLine, void*& outUserData);

+

+    void UpdateMemStats();

+

+    void ExecuteCreatePool(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteDestroyPool(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteSetAllocationUserData(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteCreateBuffer(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteDestroyBuffer(size_t lineNumber, const CsvSplit& csvSplit) { m_Stats.RegisterFunctionCall(VMA_FUNCTION::DestroyBuffer); DestroyAllocation(lineNumber, csvSplit); }

+    void ExecuteCreateImage(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteDestroyImage(size_t lineNumber, const CsvSplit& csvSplit) { m_Stats.RegisterFunctionCall(VMA_FUNCTION::DestroyImage); DestroyAllocation(lineNumber, csvSplit); }

+    void ExecuteFreeMemory(size_t lineNumber, const CsvSplit& csvSplit) { m_Stats.RegisterFunctionCall(VMA_FUNCTION::FreeMemory); DestroyAllocation(lineNumber, csvSplit); }

+    void ExecuteCreateLostAllocation(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteAllocateMemory(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteAllocateMemoryForBufferOrImage(size_t lineNumber, const CsvSplit& csvSplit, OBJECT_TYPE objType);

+    void ExecuteMapMemory(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteUnmapMemory(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteFlushAllocation(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteInvalidateAllocation(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteTouchAllocation(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteGetAllocationInfo(size_t lineNumber, const CsvSplit& csvSplit);

+    void ExecuteMakePoolAllocationsLost(size_t lineNumber, const CsvSplit& csvSplit);

+

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

+};

+

+Player::Player()

+{

+}

+

+int Player::Init()

+{

+    int result = InitVulkan();

+    

+    if(result == 0)

+    {

+        m_Stats.Init(m_MemProps->memoryHeapCount, m_MemProps->memoryTypeCount);

+        UpdateMemStats();

+    }

+    

+    return result;

+}

+

+Player::~Player()

+{

+    FinalizeVulkan();

+

+    if(g_Verbosity < VERBOSITY::MAXIMUM && m_WarningCount > MAX_WARNINGS_TO_SHOW)

+        printf("WARNING: %zu more warnings not shown.\n", m_WarningCount - MAX_WARNINGS_TO_SHOW);

+}

+

+void Player::ApplyConfig(ConfigurationParser& configParser)

+{

+    configParser.Compare(*m_DevProps, *m_MemProps, m_DedicatedAllocationEnabled);

+}

+

+void Player::ExecuteLine(size_t lineNumber, const StrRange& line)

+{

+    CsvSplit csvSplit;

+    csvSplit.Set(line);

+

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

+    {

+        // Check thread ID.

+        uint32_t threadId;

+        if(StrRangeToUint(csvSplit.GetRange(0), threadId))

+        {

+            const auto it = m_Threads.find(threadId);

+            if(it != m_Threads.end())

+            {

+                ++it->second.callCount;

+            }

+            else

+            {

+                Thread threadInfo{};

+                threadInfo.callCount = 1;

+                m_Threads[threadId] = threadInfo;

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Incorrect thread ID.\n", lineNumber);

+            }

+        }

+

+        // Save time.

+        csvSplit.GetRange(1).to_str(m_LastLineTimeStr);

+

+        // Update VMA current frame index.

+        StrRange frameIndexStr = csvSplit.GetRange(2);

+        uint32_t frameIndex;

+        if(StrRangeToUint(frameIndexStr, frameIndex))

+        {

+            if(frameIndex != m_VmaFrameIndex)

+            {

+                vmaSetCurrentFrameIndex(m_Allocator, frameIndex);

+                m_VmaFrameIndex = frameIndex;

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Incorrect frame index.\n", lineNumber);

+            }

+        }

+

+        StrRange functionName = csvSplit.GetRange(3);

+

+        if(StrRangeEq(functionName, "vmaCreateAllocator"))

+        {

+            if(ValidateFunctionParameterCount(lineNumber, csvSplit, 0, false))

+            {

+                // Nothing.

+            }

+        }

+        else if(StrRangeEq(functionName, "vmaDestroyAllocator"))

+        {

+            if(ValidateFunctionParameterCount(lineNumber, csvSplit, 0, false))

+            {

+                // Nothing.

+            }

+        }

+        else if(StrRangeEq(functionName, "vmaCreatePool"))

+            ExecuteCreatePool(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaDestroyPool"))

+            ExecuteDestroyPool(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaSetAllocationUserData"))

+            ExecuteSetAllocationUserData(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaCreateBuffer"))

+            ExecuteCreateBuffer(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaDestroyBuffer"))

+            ExecuteDestroyBuffer(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaCreateImage"))

+            ExecuteCreateImage(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaDestroyImage"))

+            ExecuteDestroyImage(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaFreeMemory"))

+            ExecuteFreeMemory(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaCreateLostAllocation"))

+            ExecuteCreateLostAllocation(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaAllocateMemory"))

+            ExecuteAllocateMemory(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaAllocateMemoryForBuffer"))

+            ExecuteAllocateMemoryForBufferOrImage(lineNumber, csvSplit, OBJECT_TYPE::BUFFER);

+        else if(StrRangeEq(functionName, "vmaAllocateMemoryForImage"))

+            ExecuteAllocateMemoryForBufferOrImage(lineNumber, csvSplit, OBJECT_TYPE::IMAGE);

+        else if(StrRangeEq(functionName, "vmaMapMemory"))

+            ExecuteMapMemory(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaUnmapMemory"))

+            ExecuteUnmapMemory(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaFlushAllocation"))

+            ExecuteFlushAllocation(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaInvalidateAllocation"))

+            ExecuteInvalidateAllocation(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaTouchAllocation"))

+            ExecuteTouchAllocation(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaGetAllocationInfo"))

+            ExecuteGetAllocationInfo(lineNumber, csvSplit);

+        else if(StrRangeEq(functionName, "vmaMakePoolAllocationsLost"))

+            ExecuteMakePoolAllocationsLost(lineNumber, csvSplit);

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Unknown function.\n", lineNumber);

+            }

+        }

+    }

+    else

+    {

+        if(IssueWarning())

+        {

+            printf("Line %zu: Too few columns.\n", lineNumber);

+        }

+    }

+}

+

+void Player::DumpStats(const char* fileNameFormat, size_t lineNumber, bool detailed)

+{

+    char* pStatsString = nullptr;

+    vmaBuildStatsString(m_Allocator, &pStatsString, detailed ? VK_TRUE : VK_FALSE);

+

+    char fileName[MAX_PATH];

+    sprintf_s(fileName, fileNameFormat, lineNumber);

+

+    FILE* file = nullptr;

+    errno_t err = fopen_s(&file, fileName, "wb");

+    if(err == 0)

+    {

+        fwrite(pStatsString, 1, strlen(pStatsString), file);

+        fclose(file);

+    }

+    else

+    {

+        printf("ERROR: Failed to write file: %s\n", fileName);

+    }

+

+    vmaFreeStatsString(m_Allocator, pStatsString);

+}

+

+void Player::Destroy(const Allocation& alloc)

+{

+    if(alloc.buffer)

+    {

+        assert(alloc.image == VK_NULL_HANDLE);

+        vmaDestroyBuffer(m_Allocator, alloc.buffer, alloc.allocation);

+    }

+    else if(alloc.image)

+    {

+        vmaDestroyImage(m_Allocator, alloc.image, alloc.allocation);

+    }

+    else

+        vmaFreeMemory(m_Allocator, alloc.allocation);

+}

+

+bool Player::FindPool(size_t lineNumber, uint64_t origPool, VmaPool& outPool)

+{

+    outPool = VK_NULL_HANDLE;

+

+    if(origPool != 0)

+    {

+        const auto poolIt = m_Pools.find(origPool);

+        if(poolIt != m_Pools.end())

+        {

+            outPool = poolIt->second.pool;

+            return true;

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Pool %llX not found.\n", lineNumber, origPool);

+            }

+        }

+    }

+

+    return true;

+}

+

+void Player::AddAllocation(size_t lineNumber, uint64_t origPtr, VkResult res, const char* functionName, Allocation&& allocDesc)

+{

+    if(origPtr)

+    {

+        if(res == VK_SUCCESS)

+        {

+            // Originally succeeded, currently succeeded.

+            // Just save pointer (done below).

+        }

+        else

+        {

+            // Originally succeeded, currently failed.

+            // Print warning. Save null pointer.

+            if(IssueWarning())

+            {

+                printf("Line %zu: %s failed (%d), while originally succeeded.\n", lineNumber, functionName, res);

+            }

+        }

+

+        const auto existingIt = m_Allocations.find(origPtr);

+        if(existingIt != m_Allocations.end())

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Allocation %llX already exists.\n", lineNumber, origPtr);

+            }

+        }

+        m_Allocations[origPtr] = std::move(allocDesc);

+    }

+    else

+    {

+        if(res == VK_SUCCESS)

+        {

+            // Originally failed, currently succeeded.

+            // Print warning, destroy the object.

+            if(IssueWarning())

+            {

+                printf("Line %zu: %s succeeded, originally failed.\n", lineNumber, functionName);

+            }

+

+            Destroy(allocDesc);

+        }

+        else

+        {

+            // Originally failed, currently failed.

+            // Print warning.

+            if(IssueWarning())

+            {

+                printf("Line %zu: %s failed (%d), originally also failed.\n", lineNumber, functionName, res);

+            }

+        }

+    }

+}

+

+bool Player::IssueWarning()

+{

+    if(g_Verbosity < VERBOSITY::MAXIMUM)

+    {

+        return m_WarningCount++ < MAX_WARNINGS_TO_SHOW;

+    }

+    else

+    {

+        ++m_WarningCount;

+        return true;

+    }

+}

+

+int Player::InitVulkan()

+{

+    if(g_Verbosity == VERBOSITY::MAXIMUM)

+    {

+        printf("Initializing Vulkan...\n");

+    }

+

+    uint32_t instanceLayerPropCount = 0;

+    VkResult res = vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, nullptr);

+    assert(res == VK_SUCCESS);

+

+    std::vector<VkLayerProperties> instanceLayerProps(instanceLayerPropCount);

+    if(instanceLayerPropCount > 0)

+    {

+        res = vkEnumerateInstanceLayerProperties(&instanceLayerPropCount, instanceLayerProps.data());

+        assert(res == VK_SUCCESS);

+    }

+

+    const bool validationLayersAvailable =

+        IsLayerSupported(instanceLayerProps.data(), instanceLayerProps.size(), VALIDATION_LAYER_NAME);

+

+    bool validationLayersEnabled = false;

+    switch(g_VK_LAYER_LUNARG_standard_validation)

+    {

+    case VULKAN_EXTENSION_REQUEST::DISABLED:

+        break;

+    case VULKAN_EXTENSION_REQUEST::DEFAULT:

+        validationLayersEnabled = validationLayersAvailable;

+        break;

+    case VULKAN_EXTENSION_REQUEST::ENABLED:

+        validationLayersEnabled = validationLayersAvailable;

+        if(!validationLayersAvailable)

+        {

+            printf("WARNING: %s layer cannot be enabled.\n", VALIDATION_LAYER_NAME);

+        }

+        break;

+    default: assert(0);

+    }

+

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

+    //instanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);

+    //instanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);

+

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

+    if(validationLayersEnabled)

+    {

+        instanceLayers.push_back(VALIDATION_LAYER_NAME);

+        instanceExtensions.push_back("VK_EXT_debug_report");

+    }

+

+    VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };

+    appInfo.pApplicationName = "VmaReplay";

+    appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);

+    appInfo.pEngineName = "Vulkan Memory Allocator";

+    appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);

+    appInfo.apiVersion = VK_API_VERSION_1_0;

+

+    VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };

+    instInfo.pApplicationInfo = &appInfo;

+    instInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size();

+    instInfo.ppEnabledExtensionNames = instanceExtensions.data();

+    instInfo.enabledLayerCount = (uint32_t)instanceLayers.size();

+    instInfo.ppEnabledLayerNames = instanceLayers.data();

+

+    res = vkCreateInstance(&instInfo, NULL, &m_VulkanInstance);

+    if(res != VK_SUCCESS)

+    {

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

+        return RESULT_ERROR_VULKAN;

+    }

+

+    if(validationLayersEnabled)

+    {

+        RegisterDebugCallbacks();

+    }

+

+    // Find physical device

+

+    uint32_t physicalDeviceCount = 0;

+    res = vkEnumeratePhysicalDevices(m_VulkanInstance, &physicalDeviceCount, nullptr);

+    assert(res == VK_SUCCESS);

+    if(physicalDeviceCount == 0)

+    {

+        printf("ERROR: No Vulkan physical devices found.\n");

+        return RESULT_ERROR_VULKAN;

+    }

+

+    std::vector<VkPhysicalDevice> physicalDevices(physicalDeviceCount);

+    res = vkEnumeratePhysicalDevices(m_VulkanInstance, &physicalDeviceCount, physicalDevices.data());

+    assert(res == VK_SUCCESS);

+

+    if(g_PhysicalDeviceIndex >= physicalDeviceCount)

+    {

+        printf("ERROR: Incorrect Vulkan physical device index %u. System has %u physical devices.\n",

+            g_PhysicalDeviceIndex,

+            physicalDeviceCount);

+        return RESULT_ERROR_VULKAN;

+    }

+

+    m_PhysicalDevice = physicalDevices[0];

+

+    // Find queue family index

+

+    uint32_t queueFamilyCount = 0;

+    vkGetPhysicalDeviceQueueFamilyProperties(m_PhysicalDevice, &queueFamilyCount, nullptr);

+    if(queueFamilyCount)

+    {

+        std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);

+        vkGetPhysicalDeviceQueueFamilyProperties(m_PhysicalDevice, &queueFamilyCount, queueFamilies.data());

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

+        {

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

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

+            {

+                m_GraphicsQueueFamilyIndex = i;

+                break;

+            }

+        }

+    }

+    if(m_GraphicsQueueFamilyIndex == UINT_MAX)

+    {

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

+        return RESULT_ERROR_VULKAN;

+    }

+

+    VkPhysicalDeviceFeatures supportedFeatures;

+    vkGetPhysicalDeviceFeatures(m_PhysicalDevice, &supportedFeatures);

+

+    // Create logical device

+

+    const float queuePriority = 1.f;

+

+    VkDeviceQueueCreateInfo deviceQueueCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO };

+    deviceQueueCreateInfo.queueFamilyIndex = m_GraphicsQueueFamilyIndex;

+    deviceQueueCreateInfo.queueCount = 1;

+    deviceQueueCreateInfo.pQueuePriorities = &queuePriority;

+

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

+    VkPhysicalDeviceFeatures enabledFeatures;

+    InitVulkanFeatures(enabledFeatures, supportedFeatures);

+

+    bool VK_KHR_get_memory_requirements2_available = false;

+    bool VK_KHR_dedicated_allocation_available = false;

+

+    // Determine list of device extensions to enable.

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

+    //enabledDeviceExtensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);

+    {

+        uint32_t propertyCount = 0;

+        res = vkEnumerateDeviceExtensionProperties(m_PhysicalDevice, nullptr, &propertyCount, nullptr);

+        assert(res == VK_SUCCESS);

+

+        if(propertyCount)

+        {

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

+            res = vkEnumerateDeviceExtensionProperties(m_PhysicalDevice, nullptr, &propertyCount, properties.data());

+            assert(res == VK_SUCCESS);

+

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

+            {

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

+                {

+                    VK_KHR_get_memory_requirements2_available = true;

+                }

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

+                {

+                    VK_KHR_dedicated_allocation_available = true;

+                }

+            }

+        }

+    }

+

+    const bool dedicatedAllocationAvailable =

+        VK_KHR_get_memory_requirements2_available && VK_KHR_dedicated_allocation_available;

+

+    switch(g_VK_KHR_dedicated_allocation_request)

+    {

+    case VULKAN_EXTENSION_REQUEST::DISABLED:

+        break;

+    case VULKAN_EXTENSION_REQUEST::DEFAULT:

+        m_DedicatedAllocationEnabled = dedicatedAllocationAvailable;

+        break;

+    case VULKAN_EXTENSION_REQUEST::ENABLED:

+        m_DedicatedAllocationEnabled = dedicatedAllocationAvailable;

+        if(!dedicatedAllocationAvailable)

+        {

+            printf("WARNING: VK_KHR_dedicated_allocation extension cannot be enabled.\n");

+        }

+        break;

+    default: assert(0);

+    }

+

+    if(m_DedicatedAllocationEnabled)

+    {

+        enabledDeviceExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);

+        enabledDeviceExtensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);

+    }

+

+    VkDeviceCreateInfo deviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };

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

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

+    deviceCreateInfo.queueCreateInfoCount = 1;

+    deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;

+    deviceCreateInfo.pEnabledFeatures = &enabledFeatures;

+

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

+    if(res != VK_SUCCESS)

+    {

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

+        return RESULT_ERROR_VULKAN;

+    }

+

+    // Create memory allocator

+

+    VmaAllocatorCreateInfo allocatorInfo = {};

+    allocatorInfo.physicalDevice = m_PhysicalDevice;

+    allocatorInfo.device = m_Device;

+    allocatorInfo.flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT;

+

+    if(m_DedicatedAllocationEnabled)

+    {

+        allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;

+    }

+

+    res = vmaCreateAllocator(&allocatorInfo, &m_Allocator);

+    if(res != VK_SUCCESS)

+    {

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

+        return RESULT_ERROR_VULKAN;

+    }

+

+    vmaGetPhysicalDeviceProperties(m_Allocator, &m_DevProps);

+    vmaGetMemoryProperties(m_Allocator, &m_MemProps);

+

+    return 0;

+}

+

+void Player::FinalizeVulkan()

+{

+    if(!m_Allocations.empty())

+    {

+        printf("WARNING: Allocations not destroyed: %zu.\n", m_Allocations.size());

+

+        if(CLEANUP_LEAKED_OBJECTS)

+        {

+            for(const auto it : m_Allocations)

+            {

+                Destroy(it.second);

+            }

+        }

+

+        m_Allocations.clear();

+    }

+

+    if(!m_Pools.empty())

+    {

+        printf("WARNING: Custom pools not destroyed: %zu.\n", m_Pools.size());

+

+        if(CLEANUP_LEAKED_OBJECTS)

+        {

+            for(const auto it : m_Pools)

+            {

+                vmaDestroyPool(m_Allocator, it.second.pool);

+            }

+        }

+

+        m_Pools.clear();

+    }

+

+    vkDeviceWaitIdle(m_Device);

+

+    if(m_Allocator != VK_NULL_HANDLE)

+    {

+        vmaDestroyAllocator(m_Allocator);

+        m_Allocator = nullptr;

+    }

+

+    if(m_Device != VK_NULL_HANDLE)

+    {

+        vkDestroyDevice(m_Device, nullptr);

+        m_Device = nullptr;

+    }

+

+    if(m_pvkDestroyDebugReportCallbackEXT && m_hCallback != VK_NULL_HANDLE)

+    {

+        m_pvkDestroyDebugReportCallbackEXT(m_VulkanInstance, m_hCallback, nullptr);

+        m_hCallback = VK_NULL_HANDLE;

+    }

+

+    if(m_VulkanInstance != VK_NULL_HANDLE)

+    {

+        vkDestroyInstance(m_VulkanInstance, NULL);

+        m_VulkanInstance = VK_NULL_HANDLE;

+    }

+}

+

+void Player::RegisterDebugCallbacks()

+{

+    m_pvkCreateDebugReportCallbackEXT =

+        reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>

+            (vkGetInstanceProcAddr(m_VulkanInstance, "vkCreateDebugReportCallbackEXT"));

+    m_pvkDebugReportMessageEXT =

+        reinterpret_cast<PFN_vkDebugReportMessageEXT>

+            (vkGetInstanceProcAddr(m_VulkanInstance, "vkDebugReportMessageEXT"));

+    m_pvkDestroyDebugReportCallbackEXT =

+        reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>

+            (vkGetInstanceProcAddr(m_VulkanInstance, "vkDestroyDebugReportCallbackEXT"));

+    assert(m_pvkCreateDebugReportCallbackEXT);

+    assert(m_pvkDebugReportMessageEXT);

+    assert(m_pvkDestroyDebugReportCallbackEXT);

+

+    VkDebugReportCallbackCreateInfoEXT callbackCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT };

+    callbackCreateInfo.flags = //VK_DEBUG_REPORT_INFORMATION_BIT_EXT |

+        VK_DEBUG_REPORT_ERROR_BIT_EXT |

+        VK_DEBUG_REPORT_WARNING_BIT_EXT |

+        VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT /*|

+        VK_DEBUG_REPORT_DEBUG_BIT_EXT*/;

+    callbackCreateInfo.pfnCallback = &MyDebugReportCallback;

+

+    VkResult res = m_pvkCreateDebugReportCallbackEXT(m_VulkanInstance, &callbackCreateInfo, nullptr, &m_hCallback);

+    assert(res == VK_SUCCESS);

+}

+

+void Player::PrintStats()

+{

+    if(g_Verbosity == VERBOSITY::MINIMUM)

+    {

+        return;

+    }

+

+    printf("Statistics:\n");

+    if(m_Stats.GetAllocationCreationCount() > 0)

+    {

+        printf("    Total allocations created: %zu\n", m_Stats.GetAllocationCreationCount());

+    }

+

+    // Buffers

+    const size_t bufferCreationCount =

+        m_Stats.GetBufferCreationCount(0) +

+        m_Stats.GetBufferCreationCount(1) +

+        m_Stats.GetBufferCreationCount(2) +

+        m_Stats.GetBufferCreationCount(3);

+    if(bufferCreationCount > 0)

+    {

+        printf("    Total buffers created: %zu\n", bufferCreationCount);

+        if(g_Verbosity == VERBOSITY::MAXIMUM)

+        {

+            printf("        Class 0 (indirect/vertex/index): %zu\n", m_Stats.GetBufferCreationCount(0));

+            printf("        Class 1 (storage): %zu\n", m_Stats.GetBufferCreationCount(1));

+            printf("        Class 2 (uniform): %zu\n", m_Stats.GetBufferCreationCount(2));

+            printf("        Class 3 (other): %zu\n", m_Stats.GetBufferCreationCount(3));

+        }

+    }

+    

+    // Images

+    const size_t imageCreationCount =

+        m_Stats.GetImageCreationCount(0) +

+        m_Stats.GetImageCreationCount(1) +

+        m_Stats.GetImageCreationCount(2) +

+        m_Stats.GetImageCreationCount(3) +

+        m_Stats.GetLinearImageCreationCount();

+    if(imageCreationCount > 0)

+    {

+        printf("    Total images created: %zu\n", imageCreationCount);

+        if(g_Verbosity == VERBOSITY::MAXIMUM)

+        {

+            printf("        Class 0 (depth/stencil): %zu\n", m_Stats.GetImageCreationCount(0));

+            printf("        Class 1 (attachment): %zu\n", m_Stats.GetImageCreationCount(1));

+            printf("        Class 2 (sampled): %zu\n", m_Stats.GetImageCreationCount(2));

+            printf("        Class 3 (other): %zu\n", m_Stats.GetImageCreationCount(3));

+            if(m_Stats.GetLinearImageCreationCount() > 0)

+            {

+                printf("        LINEAR tiling: %zu\n", m_Stats.GetLinearImageCreationCount());

+            }

+        }

+    }

+    

+    if(m_Stats.GetPoolCreationCount() > 0)

+    {

+        printf("    Total custom pools created: %zu\n", m_Stats.GetPoolCreationCount());

+    }

+

+    float lastTime;

+    if(!m_LastLineTimeStr.empty() && StrRangeToFloat(StrRange(m_LastLineTimeStr), lastTime))

+    {

+        std::string origTimeStr;

+        SecondsToFriendlyStr(lastTime, origTimeStr);

+        printf("    Original recording time: %s\n", origTimeStr.c_str());

+    }

+

+    // Thread statistics.

+    const size_t threadCount = m_Threads.size();

+    if(threadCount > 1)

+    {

+        uint32_t threadCallCountMax = 0;

+        uint32_t threadCallCountSum = 0;

+        for(const auto& it : m_Threads)

+        {

+            threadCallCountMax = std::max(threadCallCountMax, it.second.callCount);

+            threadCallCountSum += it.second.callCount;

+        }

+        printf("    Threads making calls to VMA: %zu\n", threadCount);

+        printf("        %.2f%% calls from most active thread.\n",

+            (float)threadCallCountMax * 100.f / (float)threadCallCountSum);

+    }

+    else

+    {

+        printf("    VMA used from only one thread.\n");

+    }

+

+    // Function call count

+    if(g_Verbosity == VERBOSITY::MAXIMUM)

+    {

+        printf("    Function call count:\n");

+        const size_t* const functionCallCount = m_Stats.GetFunctionCallCount();

+        for(size_t i = 0; i < (size_t)VMA_FUNCTION::Count; ++i)

+        {

+            if(functionCallCount[i] > 0)

+            {

+                printf("        %s %zu\n", VMA_FUNCTION_NAMES[i], functionCallCount[i]);

+            }

+        }

+    }

+

+    if(g_MemStatsEnabled)

+    {

+        m_Stats.PrintMemStats();

+    }

+}

+

+bool Player::ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound)

+{

+    bool ok;

+    if(lastUnbound)

+        ok = csvSplit.GetCount() >= FIRST_PARAM_INDEX + expectedParamCount - 1;

+    else

+        ok = csvSplit.GetCount() == FIRST_PARAM_INDEX + expectedParamCount;

+

+    if(!ok)

+    {

+        if(IssueWarning())

+        {

+            printf("Line %zu: Incorrect number of function parameters.\n", lineNumber);

+        }

+    }

+

+    return ok;

+}

+

+bool Player::PrepareUserData(size_t lineNumber, uint32_t allocCreateFlags, const StrRange& userDataColumn, const StrRange& wholeLine, void*& outUserData)

+{

+    if(!g_UserDataEnabled)

+    {

+        outUserData = nullptr;

+        return true;

+    }

+

+    // String

+    if((allocCreateFlags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0)

+    {

+        const size_t len = wholeLine.end - userDataColumn.beg;

+        m_UserDataTmpStr.resize(len + 1);

+        memcpy(m_UserDataTmpStr.data(), userDataColumn.beg, len);

+        m_UserDataTmpStr[len] = '\0';

+        outUserData = m_UserDataTmpStr.data();

+        return true;

+    }

+    // Pointer

+    else

+    {

+        uint64_t pUserData = 0;

+        if(StrRangeToPtr(userDataColumn, pUserData))

+        {

+            outUserData = (void*)(uintptr_t)pUserData;

+            return true;

+        }

+    }

+

+    if(IssueWarning())

+    {

+        printf("Line %zu: Invalid pUserData.\n", lineNumber);

+    }

+    outUserData = 0;

+    return false;

+}

+

+void Player::UpdateMemStats()

+{

+    if(!g_MemStatsEnabled)

+    {

+        return;

+    }

+

+    VmaStats stats;

+    vmaCalculateStats(m_Allocator, &stats);

+    m_Stats.UpdateMemStats(stats);

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::CreatePool);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 7, false))

+    {

+        VmaPoolCreateInfo poolCreateInfo = {};

+        uint64_t origPtr = 0;

+

+        if(StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX), poolCreateInfo.memoryTypeIndex) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), poolCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), poolCreateInfo.blockSize) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 3), poolCreateInfo.minBlockCount) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 4), poolCreateInfo.maxBlockCount) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), poolCreateInfo.frameInUseCount) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), origPtr))

+        {

+            m_Stats.RegisterCreatePool();

+

+            Pool poolDesc = {};

+            VkResult res = vmaCreatePool(m_Allocator, &poolCreateInfo, &poolDesc.pool);

+

+            if(origPtr)

+            {

+                if(res == VK_SUCCESS)

+                {

+                    // Originally succeeded, currently succeeded.

+                    // Just save pointer (done below).

+                }

+                else

+                {

+                    // Originally succeeded, currently failed.

+                    // Print warning. Save null pointer.

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: vmaCreatePool failed (%d), while originally succeeded.\n", lineNumber, res);

+                    }

+               }

+

+                const auto existingIt = m_Pools.find(origPtr);

+                if(existingIt != m_Pools.end())

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Pool %llX already exists.\n", lineNumber, origPtr);

+                    }

+                }

+                m_Pools[origPtr] = poolDesc;

+            }

+            else

+            {

+                if(res == VK_SUCCESS)

+                {

+                    // Originally failed, currently succeeded.

+                    // Print warning, destroy the pool.

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: vmaCreatePool succeeded, originally failed.\n", lineNumber);

+                    }

+

+                    vmaDestroyPool(m_Allocator, poolDesc.pool);

+                }

+                else

+                {

+                    // Originally failed, currently failed.

+                    // Print warning.

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: vmaCreatePool failed (%d), originally also failed.\n", lineNumber, res);

+                    }

+                }

+            }

+

+            UpdateMemStats();

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaCreatePool.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::DestroyPool);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Pools.find(origPtr);

+                if(it != m_Pools.end())

+                {

+                    vmaDestroyPool(m_Allocator, it->second.pool);

+                    UpdateMemStats();

+                    m_Pools.erase(it);

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Pool %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaDestroyPool.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::SetAllocationUserData);

+

+    if(!g_UserDataEnabled)

+    {

+        return;

+    }

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 2, true))

+    {

+        uint64_t origPtr = 0;

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            const auto it = m_Allocations.find(origPtr);

+            if(it != m_Allocations.end())

+            {

+                void* pUserData = nullptr;

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

+                {

+                    PrepareUserData(

+                        lineNumber,

+                        it->second.allocationFlags,

+                        csvSplit.GetRange(FIRST_PARAM_INDEX + 1),

+                        csvSplit.GetLine(),

+                        pUserData);

+                }

+

+                vmaSetAllocationUserData(m_Allocator, it->second.allocation, pUserData);

+            }

+            else

+            {

+                if(IssueWarning())

+                {

+                    printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaSetAllocationUserData.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::CreateBuffer);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 12, true))

+    {

+        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        uint64_t origPool = 0;

+        uint64_t origPtr = 0;

+

+        if(StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX), bufCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), bufCreateInfo.size) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), bufCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 3), (uint32_t&)bufCreateInfo.sharingMode) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 4), allocCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), (uint32_t&)allocCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), allocCreateInfo.requiredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 7), allocCreateInfo.preferredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 8), allocCreateInfo.memoryTypeBits) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 9), origPool) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 10), origPtr))

+        {

+            FindPool(lineNumber, origPool, allocCreateInfo.pool);

+

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

+            {

+                PrepareUserData(

+                    lineNumber,

+                    allocCreateInfo.flags,

+                    csvSplit.GetRange(FIRST_PARAM_INDEX + 11),

+                    csvSplit.GetLine(),

+                    allocCreateInfo.pUserData);

+            }

+

+            m_Stats.RegisterCreateBuffer(bufCreateInfo.usage);

+

+            Allocation allocDesc = { };

+            allocDesc.allocationFlags = allocCreateInfo.flags;

+            VkResult res = vmaCreateBuffer(m_Allocator, &bufCreateInfo, &allocCreateInfo, &allocDesc.buffer, &allocDesc.allocation, nullptr);

+            UpdateMemStats();

+            AddAllocation(lineNumber, origPtr, res, "vmaCreateBuffer", std::move(allocDesc));

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaCreateBuffer.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origAllocPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origAllocPtr))

+        {

+            if(origAllocPtr != 0)

+            {

+                const auto it = m_Allocations.find(origAllocPtr);

+                if(it != m_Allocations.end())

+                {

+                    Destroy(it->second);

+                    UpdateMemStats();

+                    m_Allocations.erase(it);

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Allocation %llX not found.\n", lineNumber, origAllocPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaDestroyBuffer.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::CreateImage);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 21, true))

+    {

+        VkImageCreateInfo imageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        uint64_t origPool = 0;

+        uint64_t origPtr = 0;

+

+        if(StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX), imageCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), (uint32_t&)imageCreateInfo.imageType) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), (uint32_t&)imageCreateInfo.format) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 3), imageCreateInfo.extent.width) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 4), imageCreateInfo.extent.height) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), imageCreateInfo.extent.depth) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), imageCreateInfo.mipLevels) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 7), imageCreateInfo.arrayLayers) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 8), (uint32_t&)imageCreateInfo.samples) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 9), (uint32_t&)imageCreateInfo.tiling) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 10), imageCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 11), (uint32_t&)imageCreateInfo.sharingMode) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 12), (uint32_t&)imageCreateInfo.initialLayout) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 13), allocCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 14), (uint32_t&)allocCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 15), allocCreateInfo.requiredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 16), allocCreateInfo.preferredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 17), allocCreateInfo.memoryTypeBits) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 18), origPool) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 19), origPtr))

+        {

+            FindPool(lineNumber, origPool, allocCreateInfo.pool);

+

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

+            {

+                PrepareUserData(

+                    lineNumber,

+                    allocCreateInfo.flags,

+                    csvSplit.GetRange(FIRST_PARAM_INDEX + 20),

+                    csvSplit.GetLine(),

+                    allocCreateInfo.pUserData);

+            }

+

+            m_Stats.RegisterCreateImage(imageCreateInfo.usage, imageCreateInfo.tiling);

+

+            Allocation allocDesc = {};

+            allocDesc.allocationFlags = allocCreateInfo.flags;

+            VkResult res = vmaCreateImage(m_Allocator, &imageCreateInfo, &allocCreateInfo, &allocDesc.image, &allocDesc.allocation, nullptr);

+            UpdateMemStats();

+            AddAllocation(lineNumber, origPtr, res, "vmaCreateImage", std::move(allocDesc));

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaCreateImage.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::CreateLostAllocation);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            Allocation allocDesc = {};

+            vmaCreateLostAllocation(m_Allocator, &allocDesc.allocation);

+            UpdateMemStats();

+            m_Stats.RegisterCreateAllocation();

+

+            AddAllocation(lineNumber, origPtr, VK_SUCCESS, "vmaCreateLostAllocation", std::move(allocDesc));

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaCreateLostAllocation.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::AllocateMemory);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 11, true))

+    {

+        VkMemoryRequirements memReq = {};

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        uint64_t origPool = 0;

+        uint64_t origPtr = 0;

+

+        if(StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX), memReq.size) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), memReq.alignment) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), memReq.memoryTypeBits) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 3), allocCreateInfo.flags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 4), (uint32_t&)allocCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), allocCreateInfo.requiredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), allocCreateInfo.preferredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 7), allocCreateInfo.memoryTypeBits) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 8), origPool) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 9), origPtr))

+        {

+            FindPool(lineNumber, origPool, allocCreateInfo.pool);

+

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

+            {

+                PrepareUserData(

+                    lineNumber,

+                    allocCreateInfo.flags,

+                    csvSplit.GetRange(FIRST_PARAM_INDEX + 10),

+                    csvSplit.GetLine(),

+                    allocCreateInfo.pUserData);

+            }

+

+            UpdateMemStats();

+            m_Stats.RegisterCreateAllocation();

+

+            Allocation allocDesc = {};

+            allocDesc.allocationFlags = allocCreateInfo.flags;

+            VkResult res = vmaAllocateMemory(m_Allocator, &memReq, &allocCreateInfo, &allocDesc.allocation, nullptr);

+            AddAllocation(lineNumber, origPtr, res, "vmaAllocateMemory", std::move(allocDesc));

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaAllocateMemory.\n", lineNumber);

+            }

+        }

+    }

+}

+

+void Player::ExecuteAllocateMemoryForBufferOrImage(size_t lineNumber, const CsvSplit& csvSplit, OBJECT_TYPE objType)

+{

+    switch(objType)

+    {

+    case OBJECT_TYPE::BUFFER:

+        m_Stats.RegisterFunctionCall(VMA_FUNCTION::AllocateMemoryForBuffer);

+        break;

+    case OBJECT_TYPE::IMAGE:

+        m_Stats.RegisterFunctionCall(VMA_FUNCTION::AllocateMemoryForImage);

+        break;

+    default: assert(0);

+    }

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 13, true))

+    {

+        VkMemoryRequirements memReq = {};

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        bool requiresDedicatedAllocation = false;

+        bool prefersDedicatedAllocation = false;

+        uint64_t origPool = 0;

+        uint64_t origPtr = 0;

+

+        if(StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX), memReq.size) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), memReq.alignment) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), memReq.memoryTypeBits) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 3), allocCreateInfo.flags) &&

+            StrRangeToBool(csvSplit.GetRange(FIRST_PARAM_INDEX + 4), requiresDedicatedAllocation) &&

+            StrRangeToBool(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), prefersDedicatedAllocation) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), (uint32_t&)allocCreateInfo.usage) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 7), allocCreateInfo.requiredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 8), allocCreateInfo.preferredFlags) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 9), allocCreateInfo.memoryTypeBits) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 10), origPool) &&

+            StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 11), origPtr))

+        {

+            FindPool(lineNumber, origPool, allocCreateInfo.pool);

+

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

+            {

+                PrepareUserData(

+                    lineNumber,

+                    allocCreateInfo.flags,

+                    csvSplit.GetRange(FIRST_PARAM_INDEX + 12),

+                    csvSplit.GetLine(),

+                    allocCreateInfo.pUserData);

+            }

+

+            if(requiresDedicatedAllocation || prefersDedicatedAllocation)

+            {

+                allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+            }

+

+            if(!m_AllocateForBufferImageWarningIssued)

+            {

+                if(IssueWarning())

+                {

+                    printf("Line %zu: vmaAllocateMemoryForBuffer or vmaAllocateMemoryForImage cannot be replayed accurately. Using vmaCreateAllocation instead.\n", lineNumber);

+                }

+                m_AllocateForBufferImageWarningIssued = true;

+            }

+

+            UpdateMemStats();

+            m_Stats.RegisterCreateAllocation();

+

+            Allocation allocDesc = {};

+            allocDesc.allocationFlags = allocCreateInfo.flags;

+            VkResult res = vmaAllocateMemory(m_Allocator, &memReq, &allocCreateInfo, &allocDesc.allocation, nullptr);

+            AddAllocation(lineNumber, origPtr, res, "vmaAllocateMemory (called as vmaAllocateMemoryForBuffer or vmaAllocateMemoryForImage)", std::move(allocDesc));

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaAllocateMemoryForBuffer or vmaAllocateMemoryForImage.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::MapMemory);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Allocations.find(origPtr);

+                if(it != m_Allocations.end())

+                {

+                    if(it->second.allocation)

+                    {

+                        void* pData;

+                        VkResult res = vmaMapMemory(m_Allocator, it->second.allocation, &pData);

+                        if(res != VK_SUCCESS)

+                        {

+                            printf("Line %zu: vmaMapMemory failed (%d)\n", lineNumber, res);

+                        }

+                    }

+                    else

+                    {

+                        if(IssueWarning())

+                        {

+                            printf("Line %zu: Cannot call vmaMapMemory - allocation is null.\n", lineNumber);

+                        }

+                    }

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaMapMemory.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::UnmapMemory);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Allocations.find(origPtr);

+                if(it != m_Allocations.end())

+                {

+                    if(it->second.allocation)

+                    {

+                        vmaUnmapMemory(m_Allocator, it->second.allocation);

+                    }

+                    else

+                    {

+                        if(IssueWarning())

+                        {

+                            printf("Line %zu: Cannot call vmaUnmapMemory - allocation is null.\n", lineNumber);

+                        }

+                    }

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaMapMemory.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::FlushAllocation);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 3, false))

+    {

+        uint64_t origPtr = 0;

+        uint64_t offset = 0;

+        uint64_t size = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), offset) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), size))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Allocations.find(origPtr);

+                if(it != m_Allocations.end())

+                {

+                    if(it->second.allocation)

+                    {

+                        vmaFlushAllocation(m_Allocator, it->second.allocation, offset, size);

+                    }

+                    else

+                    {

+                        if(IssueWarning())

+                        {

+                            printf("Line %zu: Cannot call vmaFlushAllocation - allocation is null.\n", lineNumber);

+                        }

+                    }

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaFlushAllocation.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::InvalidateAllocation);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 3, false))

+    {

+        uint64_t origPtr = 0;

+        uint64_t offset = 0;

+        uint64_t size = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 1), offset) &&

+            StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 2), size))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Allocations.find(origPtr);

+                if(it != m_Allocations.end())

+                {

+                    if(it->second.allocation)

+                    {

+                        vmaInvalidateAllocation(m_Allocator, it->second.allocation, offset, size);

+                    }

+                    else

+                    {

+                        if(IssueWarning())

+                        {

+                            printf("Line %zu: Cannot call vmaInvalidateAllocation - allocation is null.\n", lineNumber);

+                        }

+                    }

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaInvalidateAllocation.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::TouchAllocation);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            const auto it = m_Allocations.find(origPtr);

+            if(it != m_Allocations.end())

+            {

+                if(it->second.allocation)

+                {

+                    vmaTouchAllocation(m_Allocator, it->second.allocation);

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Cannot call vmaTouchAllocation - allocation is null.\n", lineNumber);

+                    }

+                }

+            }

+            else

+            {

+                if(IssueWarning())

+                {

+                    printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaTouchAllocation.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::GetAllocationInfo);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            const auto it = m_Allocations.find(origPtr);

+            if(it != m_Allocations.end())

+            {

+                if(it->second.allocation)

+                {

+                    VmaAllocationInfo allocInfo;

+                    vmaGetAllocationInfo(m_Allocator, it->second.allocation, &allocInfo);

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Cannot call vmaGetAllocationInfo - allocation is null.\n", lineNumber);

+                    }

+                }

+            }

+            else

+            {

+                if(IssueWarning())

+                {

+                    printf("Line %zu: Allocation %llX not found.\n", lineNumber, origPtr);

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaGetAllocationInfo.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+{

+    m_Stats.RegisterFunctionCall(VMA_FUNCTION::MakePoolAllocationsLost);

+

+    if(ValidateFunctionParameterCount(lineNumber, csvSplit, 1, false))

+    {

+        uint64_t origPtr = 0;

+

+        if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr))

+        {

+            if(origPtr != 0)

+            {

+                const auto it = m_Pools.find(origPtr);

+                if(it != m_Pools.end())

+                {

+                    vmaMakePoolAllocationsLost(m_Allocator, it->second.pool, nullptr);

+                    UpdateMemStats();

+                }

+                else

+                {

+                    if(IssueWarning())

+                    {

+                        printf("Line %zu: Pool %llX not found.\n", lineNumber, origPtr);

+                    }

+                }

+            }

+        }

+        else

+        {

+            if(IssueWarning())

+            {

+                printf("Line %zu: Invalid parameters for vmaMakePoolAllocationsLost.\n", lineNumber);

+            }

+        }

+    }

+}

+

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

+// Main functions

+

+static void PrintCommandLineSyntax()

+{

+    printf(

+        "Command line syntax:\n"

+        "    VmaReplay [Options] <SrcFile.csv>\n"

+        "Available options:\n"

+        "    -v <Number> - Verbosity level:\n"

+        "        0 - Minimum verbosity. Prints only warnings and errors.\n"

+        "        1 - Default verbosity. Prints important messages and statistics.\n"

+        "        2 - Maximum verbosity. Prints a lot of information.\n"

+        "    -i <Number> - Repeat playback given number of times (iterations)\n"

+        "        Default is 1. Vulkan is reinitialized with every iteration.\n"

+        "    --MemStats <Value> - 0 to disable or 1 to enable memory statistics.\n"

+        "        Default is 0. Enabling it may negatively impact playback performance.\n"

+        "    --DumpStatsAfterLine <Line> - Dump VMA statistics to JSON file after specified source file line finishes execution.\n"

+        "        File is written to current directory with name: VmaReplay_Line####.json.\n"

+        "        This parameter can be repeated.\n"

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

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

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

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

+        "    --UserData <Value> - 0 to disable or 1 to enable setting pUserData during playback.\n"

+        "        Default is 1. Affects both creation of buffers and images, as well as calls to vmaSetAllocationUserData.\n"

+        "    --VK_LAYER_LUNARG_standard_validation <Value> - 0 to disable or 1 to enable validation layers.\n"

+        "        By default the layers are silently enabled if available.\n"

+        "    --VK_KHR_dedicated_allocation <Value> - 0 to disable or 1 to enable this extension.\n"

+        "        By default the extension is silently enabled if available.\n"

+    );

+}

+

+static int ProcessFile(size_t iterationIndex, const char* data, size_t numBytes, duration& outDuration)

+{

+    outDuration = duration::max();

+

+    const bool useLineRanges = !g_LineRanges.IsEmpty();

+    const bool useDumpStatsAfterLine = !g_DumpStatsAfterLine.empty();

+

+    LineSplit lineSplit(data, numBytes);

+    StrRange line;

+

+    if(!lineSplit.GetNextLine(line) ||

+        !StrRangeEq(line, "Vulkan Memory Allocator,Calls recording"))

+    {

+        printf("ERROR: Incorrect file format.\n");

+        return RESULT_ERROR_FORMAT;

+    }

+

+    if(!lineSplit.GetNextLine(line) || !ParseFileVersion(line) || !ValidateFileVersion())

+    {

+        printf("ERROR: Incorrect file format version.\n");

+        return RESULT_ERROR_FORMAT;

+    }

+

+    if(g_Verbosity == VERBOSITY::MAXIMUM)

+    {

+        printf("Format version: %u,%u\n",

+            GetVersionMajor(g_FileVersion),

+            GetVersionMinor(g_FileVersion));

+    }

+

+    // Parse configuration

+    const bool configEnabled = g_FileVersion >= MakeVersion(1, 3);

+    ConfigurationParser configParser;

+    if(configEnabled)

+    {

+        if(!configParser.Parse(lineSplit))

+        {

+            return RESULT_ERROR_FORMAT;

+        }

+    }

+

+    Player player;

+    int result = player.Init();

+

+    if(configEnabled)

+    {

+        player.ApplyConfig(configParser);

+    }

+

+    size_t executedLineCount = 0;

+    if(result == 0)

+    {

+        if(g_Verbosity > VERBOSITY::MINIMUM)

+        {

+            if(useLineRanges)

+            {

+                printf("Playing #%zu (limited range of lines)...\n", iterationIndex + 1);

+            }

+            else

+            {

+                printf("Playing #%zu...\n", iterationIndex + 1);

+            }

+        }

+

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

+

+        while(lineSplit.GetNextLine(line))

+        {

+            const size_t currLineNumber = lineSplit.GetNextLineIndex();

+

+            bool execute = true;

+            if(useLineRanges)

+            {

+                execute = g_LineRanges.Includes(currLineNumber);

+            }

+

+            if(execute)

+            {

+                player.ExecuteLine(currLineNumber, line);

+                ++executedLineCount;

+            }

+

+            while(useDumpStatsAfterLine &&

+                g_DumpStatsAfterLineNextIndex < g_DumpStatsAfterLine.size() &&

+                currLineNumber >= g_DumpStatsAfterLine[g_DumpStatsAfterLineNextIndex].line)

+            {

+                const size_t requestedLine = g_DumpStatsAfterLine[g_DumpStatsAfterLineNextIndex].line;

+                const bool detailed = g_DumpStatsAfterLine[g_DumpStatsAfterLineNextIndex].detailed;

+                

+                if(g_Verbosity == VERBOSITY::MAXIMUM)

+                {

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

+                        detailed ? "detailed " : "",

+                        requestedLine,

+                        currLineNumber);

+                }

+

+                player.DumpStats("VmaReplay_Line%04zu.json", requestedLine, detailed);

+                

+                ++g_DumpStatsAfterLineNextIndex;

+            }

+        }

+

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

+        outDuration = playDuration;

+

+        // End stats.

+        if(g_Verbosity > VERBOSITY::MINIMUM)

+        {

+            std::string playDurationStr;

+            SecondsToFriendlyStr(ToFloatSeconds(playDuration), playDurationStr);

+

+            printf("Done.\n");

+            printf("Playback took: %s\n", playDurationStr.c_str());

+        }

+        if(g_Verbosity == VERBOSITY::MAXIMUM)

+        {

+            printf("File lines: %zu\n", lineSplit.GetNextLineIndex());

+            printf("Executed %zu file lines\n", executedLineCount);

+        }

+

+        player.PrintStats();

+    }

+

+    return result;

+}

+

+static int ProcessFile()

+{

+    if(g_Verbosity > VERBOSITY::MINIMUM)

+    {

+        printf("Loading file \"%s\"...\n", g_FilePath.c_str());

+    }

+    int result = 0;

+

+    FILE* file = nullptr;

+    const errno_t err = fopen_s(&file, g_FilePath.c_str(), "rb");

+    if(err == 0)

+    {

+        _fseeki64(file, 0, SEEK_END);

+        const size_t fileSize = (size_t)_ftelli64(file);

+        _fseeki64(file, 0, SEEK_SET);

+

+        if(fileSize > 0)

+        {

+            std::vector<char> fileContents(fileSize);

+            fread(fileContents.data(), 1, fileSize, file);

+

+            // Begin stats.

+            if(g_Verbosity == VERBOSITY::MAXIMUM)

+            {

+                printf("File size: %zu B\n", fileSize);

+            }

+

+            duration durationSum = duration::zero();

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

+            {

+                duration currDuration;

+                ProcessFile(i, fileContents.data(), fileContents.size(), currDuration);

+                durationSum += currDuration;

+            }

+

+            if(g_IterationCount > 1)

+            {

+                std::string playDurationStr;

+                SecondsToFriendlyStr(ToFloatSeconds(durationSum / g_IterationCount), playDurationStr);

+                printf("Average playback time from %zu iterations: %s\n", g_IterationCount, playDurationStr.c_str());

+            }

+        }

+        else

+        {

+            printf("ERROR: Source file is empty.\n");

+            result = RESULT_ERROR_SOURCE_FILE;

+        }

+

+        fclose(file);

+    }

+    else

+    {

+        printf("ERROR: Couldn't open file (%i).\n", err);

+        result = RESULT_ERROR_SOURCE_FILE;

+    }

+

+    return result;

+}

+

+static int main2(int argc, char** argv)

+{

+    CmdLineParser cmdLineParser(argc, argv);

+

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_VERBOSITY, 'v', true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_ITERATIONS, 'i', true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_LINES, "Lines", true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_PHYSICAL_DEVICE, "PhysicalDevice", true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_USER_DATA, "UserData", true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION, "VK_KHR_dedicated_allocation", true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION, VALIDATION_LAYER_NAME, true);

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

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

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

+

+    CmdLineParser::RESULT res;

+    while((res = cmdLineParser.ReadNext()) != CmdLineParser::RESULT_END)

+    {

+        switch(res)

+        {

+        case CmdLineParser::RESULT_OPT:

+            switch(cmdLineParser.GetOptId())

+            {

+            case CMD_LINE_OPT_VERBOSITY:

+                {

+                    uint32_t verbosityVal = UINT32_MAX;

+                    if(StrRangeToUint(StrRange(cmdLineParser.GetParameter()), verbosityVal) &&

+                        verbosityVal < (uint32_t)VERBOSITY::COUNT)

+                    {

+                        g_Verbosity = (VERBOSITY)verbosityVal;

+                    }

+                    else

+                    {

+                        PrintCommandLineSyntax();

+                        return RESULT_ERROR_COMMAND_LINE;

+                    }

+                }

+                break;

+            case CMD_LINE_OPT_ITERATIONS:

+                if(!StrRangeToUint(StrRange(cmdLineParser.GetParameter()), g_IterationCount))

+                {

+                    PrintCommandLineSyntax();

+                    return RESULT_ERROR_COMMAND_LINE;

+                }

+                break;

+            case CMD_LINE_OPT_LINES:

+                if(!g_LineRanges.Parse(StrRange(cmdLineParser.GetParameter())))

+                {

+                    PrintCommandLineSyntax();

+                    return RESULT_ERROR_COMMAND_LINE;

+                }

+                break;

+            case CMD_LINE_OPT_PHYSICAL_DEVICE:

+                if(!StrRangeToUint(StrRange(cmdLineParser.GetParameter()), g_PhysicalDeviceIndex))

+                {

+                    PrintCommandLineSyntax();

+                    return RESULT_ERROR_COMMAND_LINE;

+                }

+                break;

+            case CMD_LINE_OPT_USER_DATA:

+                if(!StrRangeToBool(StrRange(cmdLineParser.GetParameter()), g_UserDataEnabled))

+                {

+                    PrintCommandLineSyntax();

+                    return RESULT_ERROR_COMMAND_LINE;

+                }

+                break;

+            case CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION:

+                {

+                    bool newValue;

+                    if(StrRangeToBool(StrRange(cmdLineParser.GetParameter()), newValue))

+                    {

+                        g_VK_KHR_dedicated_allocation_request = newValue ?

+                            VULKAN_EXTENSION_REQUEST::ENABLED :

+                            VULKAN_EXTENSION_REQUEST::DISABLED;

+                    }

+                    else

+                    {

+                        PrintCommandLineSyntax();

+                        return RESULT_ERROR_COMMAND_LINE;

+                    }

+                }

+                break;

+            case CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION:

+                {

+                    bool newValue;

+                    if(StrRangeToBool(StrRange(cmdLineParser.GetParameter()), newValue))

+                    {

+                        g_VK_LAYER_LUNARG_standard_validation = newValue ?

+                            VULKAN_EXTENSION_REQUEST::ENABLED :

+                            VULKAN_EXTENSION_REQUEST::DISABLED;

+                    }

+                    else

+                    {

+                        PrintCommandLineSyntax();

+                        return RESULT_ERROR_COMMAND_LINE;

+                    }

+                }

+                break;

+            case CMD_LINE_OPT_MEM_STATS:

+                if(!StrRangeToBool(StrRange(cmdLineParser.GetParameter()), g_MemStatsEnabled))

+                {

+                    PrintCommandLineSyntax();

+                    return RESULT_ERROR_COMMAND_LINE;

+                }

+                break;

+            case CMD_LINE_OPT_DUMP_STATS_AFTER_LINE:

+            case CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE:

+                {

+                    size_t line;

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

+                    {

+                        const bool detailed =

+                            cmdLineParser.GetOptId() == CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE;

+                        g_DumpStatsAfterLine.push_back({line, detailed});

+                    }

+                    else

+                    {

+                        PrintCommandLineSyntax();

+                        return RESULT_ERROR_COMMAND_LINE;

+                    }

+                }

+                break;

+            default:

+                assert(0);

+            }

+            break;

+        case CmdLineParser::RESULT_PARAMETER:

+            if(g_FilePath.empty())

+            {

+                g_FilePath = cmdLineParser.GetParameter();

+            }

+            else

+            {

+                PrintCommandLineSyntax();

+                return RESULT_ERROR_COMMAND_LINE;

+            }

+            break;

+        case CmdLineParser::RESULT_ERROR:

+            PrintCommandLineSyntax();

+            return RESULT_ERROR_COMMAND_LINE;

+            break;

+        default:

+            assert(0);

+        }

+    }

+

+    // Postprocess command line parameters.

+

+    if(g_FilePath.empty())

+    {

+        PrintCommandLineSyntax();

+        return RESULT_ERROR_COMMAND_LINE;

+    }

+

+    // Sort g_DumpStatsAfterLine and make unique.

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

+    g_DumpStatsAfterLine.erase(

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

+        g_DumpStatsAfterLine.end());

+

+    return ProcessFile();

+}

+

+int main(int argc, char** argv)

+{

+    try

+    {

+        return main2(argc, argv);

+    }

+    catch(const std::exception& e)

+    {

+        printf("ERROR: %s\n", e.what());

+        return RESULT_EXCEPTION;

+    }

+    catch(...)

+    {

+        printf("UNKNOWN ERROR\n");

+        return RESULT_EXCEPTION;

+    }

+}

diff --git a/src/VmaReplay/VmaUsage.cpp b/src/VmaReplay/VmaUsage.cpp
new file mode 100644
index 0000000..d2d035b
--- /dev/null
+++ b/src/VmaReplay/VmaUsage.cpp
@@ -0,0 +1,2 @@
+#define VMA_IMPLEMENTATION

+#include "VmaUsage.h"

diff --git a/src/VmaReplay/VmaUsage.h b/src/VmaReplay/VmaUsage.h
new file mode 100644
index 0000000..182132b
--- /dev/null
+++ b/src/VmaReplay/VmaUsage.h
@@ -0,0 +1,27 @@
+#pragma once

+

+#define NOMINMAX

+#define WIN32_LEAN_AND_MEAN

+#include <Windows.h>

+#define VK_USE_PLATFORM_WIN32_KHR

+

+#include <vulkan/vulkan.h>

+

+//#define VMA_USE_STL_CONTAINERS 1

+

+//#define VMA_HEAVY_ASSERT(expr) assert(expr)

+

+//#define VMA_DEDICATED_ALLOCATION 0

+

+//#define VMA_DEBUG_MARGIN 16

+//#define VMA_DEBUG_DETECT_CORRUPTION 1

+//#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1

+

+#pragma warning(push, 4)

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

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

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

+

+#include "../vk_mem_alloc.h"

+

+#pragma warning(pop)

diff --git a/src/VmaUsage.h b/src/VmaUsage.h
index 79daaf8..e788a30 100644
--- a/src/VmaUsage.h
+++ b/src/VmaUsage.h
@@ -25,6 +25,7 @@
 //#define VMA_DEBUG_MARGIN 16

 //#define VMA_DEBUG_DETECT_CORRUPTION 1

 //#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1

+//#define VMA_RECORDING_ENABLED 0

 

 #pragma warning(push, 4)

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

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index 91f2bf2..d33861e 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -190,6 +190,18 @@
     {

         return VK_FALSE;

     }

+

+    /*

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

+    Ignoring because we map entire VkDeviceMemory blocks, where different types of

+    images and buffers may end up together, especially on GPUs with unified memory

+    like Intel.

+    */

+    if(strstr(pMessage, "Mapping an image with layout") != nullptr &&

+        strstr(pMessage, "can result in undefined behavior if this memory is used by the device") != nullptr)

+    {

+        return VK_FALSE;

+    }

     

     switch(flags)

     {

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index f0cb5ed..ce04a15 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -29,7 +29,7 @@
 

 /** \mainpage Vulkan Memory Allocator

 

-<b>Version 2.1.0-alpha.3</b> (2018-06-14)

+<b>Version 2.1.0-alpha.4</b> (2018-08-22)

 

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

 License: MIT

@@ -67,6 +67,7 @@
     - [Memory initialization](@ref debugging_memory_usage_initialization)

     - [Margins](@ref debugging_memory_usage_margins)

     - [Corruption detection](@ref debugging_memory_usage_corruption_detection)

+  - \subpage record_and_replay

 - \subpage usage_patterns

   - [Simple patterns](@ref usage_patterns_simple)

   - [Advanced patterns](@ref usage_patterns_advanced)

@@ -298,7 +299,7 @@
 They are safer and more convenient to use than standard Vulkan functions.

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

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

-They way it's implemented is that the library always maps entire memory block, not just region of the allocation.

+The way it's implemented is that the library always maps entire memory block, not just region of the allocation.

 For further details, see description of vmaMapMemory() function.

 Example:

 

@@ -312,7 +313,7 @@
 ConstantBuffer constantBufferData;

 

 VmaAllocator allocator;

-VmaBuffer constantBuffer;

+VkBuffer constantBuffer;

 VmaAllocation constantBufferAllocation;

 

 // You can map and fill your buffer using following code:

@@ -323,6 +324,16 @@
 vmaUnmapMemory(allocator, constantBufferAllocation);

 \endcode

 

+When mapping, you may see a warning from Vulkan validation layer similar to this one:

+

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

+

+It happens because the library maps entire `VkDeviceMemory` 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.

+

+

 \section memory_mapping_persistently_mapped_memory Persistently mapped memory

 

 Kepping your memory persistently mapped is generally OK in Vulkan.

@@ -910,6 +921,52 @@
 `HOST_VISIBLE` and `HOST_COHERENT`.

 

 

+\page record_and_replay Record and replay

+

+\section record_and_replay_introduction Introduction

+

+While using the library, sequence of calls to its functions together with their

+parameters can be recorded to a file and later replayed using standalone player

+application. It can be useful to:

+

+- Test correctness - check if same sequence of calls will not cause crash or

+  failures on a target platform.

+- Gather statistics - see number of allocations, peak memory usage, number of

+  calls etc.

+- Benchmark performance - see how much time it takes to replay the whole

+  sequence.

+

+\section record_and_replay_usage Usage

+

+<b>To record sequence of calls to a file:</b> Fill in

+VmaAllocatorCreateInfo::pRecordSettings member while creating #VmaAllocator

+object. File is opened and written during whole lifetime of the allocator.

+

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

+

+    VmaReplay.exe MyRecording.csv

+

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

+

+\section record_and_replay_additional_considerations Additional considerations

+

+- Replaying file that was recorded on a different GPU (with different parameters

+  like `bufferImageGranularity`, `nonCoherentAtomSize`, and especially different

+  set of memory heaps and types) may give different performance and memory usage

+  results, as well as issue some warnings and errors.

+- Current implementation of recording in VMA, as well as VmaReplay application, is

+  coded and tested only on Windows. Inclusion of recording code is driven by

+  `VMA_RECORDING_ENABLED` macro. Support for other platforms should be easy to

+  add. Contributions are welcomed.

+- Currently calls to vmaDefragment() function are not recorded.

+

+

 \page usage_patterns Recommended usage patterns

 

 See also slides from talk:

@@ -1150,6 +1207,23 @@
   threads at the same time if you pass the same #VmaAllocation object to these

   functions.

 

+\section general_considerations_validation_layer_warnings Validation layer warnings

+

+When using this library, you can meet following types of warnings issued by

+Vulkan validation layer. They don't necessarily indicate a bug, so you may need

+to just ignore them.

+

+- *vkBindBufferMemory(): Binding memory to buffer 0xeb8e4 but vkGetBufferMemoryRequirements() has not been called on that buffer.*

+  - It happens when VK_KHR_dedicated_allocation extension is enabled.

+    `vkGetBufferMemoryRequirements2KHR` function is used instead, while validation layer seems to be unaware of it.

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

+  - It happens when you map a buffer or image, because the library maps entire

+    `VkDeviceMemory` block, where different types of images and buffers may end

+    up together, especially on GPUs with unified memory like Intel.

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

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

+    created in place of an existing object that bacame lost.

+

 \section general_considerations_allocation_algorithm Allocation algorithm

 

 The library uses following algorithm for allocation, in order:

@@ -1171,7 +1245,7 @@
 Features deliberately excluded from the scope of this library:

 

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

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

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

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

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

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

@@ -1290,6 +1364,46 @@
 #endif

 } VmaVulkanFunctions;

 

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

+typedef enum VmaRecordFlagBits {

+    /** \brief Enables flush after recording every function call.

+

+    Enable it if you expect your application to crash, which may leave recording file truncated.

+    It may degrade performance though.

+    */

+    VMA_RECORD_FLUSH_AFTER_CALL_BIT = 0x00000001,

+    

+    VMA_RECORD_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF

+} VmaRecordFlagBits;

+typedef VkFlags VmaRecordFlags;

+

+/*

+Define this macro to 0/1 to disable/enable support for recording functionality,

+available through VmaAllocatorCreateInfo::pRecordSettings.

+*/

+#ifndef VMA_RECORDING_ENABLED

+    #ifdef _WIN32

+        #define VMA_RECORDING_ENABLED 1

+    #else

+        #define VMA_RECORDING_ENABLED 0

+    #endif

+#endif

+

+/// Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSettings.

+typedef struct VmaRecordSettings

+{

+    /// Flags for recording. Use #VmaRecordFlagBits enum.

+    VmaRecordFlags flags;

+    /** \brief Path to the file that should be written by the recording.

+

+    Suggested extension: "csv".

+    If the file already exists, it will be overwritten.

+    It will be opened for the whole time #VmaAllocator object is alive.

+    If opening this file fails, creation of the whole allocator object fails.

+    */

+    const char* pFilePath;

+} VmaRecordSettings;

+

 /// Description of a Allocator to be created.

 typedef struct VmaAllocatorCreateInfo

 {

@@ -1360,6 +1474,13 @@
     e.g. fetched using `vkGetInstanceProcAddr()` and `vkGetDeviceProcAddr()`.

     */

     const VmaVulkanFunctions* pVulkanFunctions;

+    /** \brief Parameters for recording of VMA calls. Can be null.

+

+    If not null, it enables recording of calls to VMA functions to a file.

+    If support for recording is not enabled using `VMA_RECORDING_ENABLED` macro,

+    creation of the allocator object fails with `VK_ERROR_FEATURE_NOT_PRESENT`.

+    */

+    const VmaRecordSettings* pRecordSettings;

 } VmaAllocatorCreateInfo;

 

 /// Creates Allocator object.

@@ -2694,6 +2815,11 @@
 	return (x + (y / (T)2)) / y;

 }

 

+static inline bool VmaStrIsEmpty(const char* pStr)

+{

+    return pStr == VMA_NULL || *pStr == '\0';

+}

+

 #ifndef VMA_SORT

 

 template<typename Iterator, typename Compare>

@@ -4835,6 +4961,106 @@
         uint32_t maxAllocationsToMove);

 };

 

+#if VMA_RECORDING_ENABLED

+

+class VmaRecorder

+{

+public:

+    VmaRecorder();

+    VkResult Init(const VmaRecordSettings& settings, bool useMutex);

+    void WriteConfiguration(

+        const VkPhysicalDeviceProperties& devProps,

+        const VkPhysicalDeviceMemoryProperties& memProps,

+        bool dedicatedAllocationExtensionEnabled);

+    ~VmaRecorder();

+

+    void RecordCreateAllocator(uint32_t frameIndex);

+    void RecordDestroyAllocator(uint32_t frameIndex);

+    void RecordCreatePool(uint32_t frameIndex,

+        const VmaPoolCreateInfo& createInfo,

+        VmaPool pool);

+    void RecordDestroyPool(uint32_t frameIndex, VmaPool pool);

+    void RecordAllocateMemory(uint32_t frameIndex,

+        const VkMemoryRequirements& vkMemReq,

+        const VmaAllocationCreateInfo& createInfo,

+        VmaAllocation allocation);

+    void RecordAllocateMemoryForBuffer(uint32_t frameIndex,

+        const VkMemoryRequirements& vkMemReq,

+        bool requiresDedicatedAllocation,

+        bool prefersDedicatedAllocation,

+        const VmaAllocationCreateInfo& createInfo,

+        VmaAllocation allocation);

+    void RecordAllocateMemoryForImage(uint32_t frameIndex,

+        const VkMemoryRequirements& vkMemReq,

+        bool requiresDedicatedAllocation,

+        bool prefersDedicatedAllocation,

+        const VmaAllocationCreateInfo& createInfo,

+        VmaAllocation allocation);

+    void RecordFreeMemory(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordSetAllocationUserData(uint32_t frameIndex,

+        VmaAllocation allocation,

+        const void* pUserData);

+    void RecordCreateLostAllocation(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordMapMemory(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordUnmapMemory(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordFlushAllocation(uint32_t frameIndex,

+        VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size);

+    void RecordInvalidateAllocation(uint32_t frameIndex,

+        VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size);

+    void RecordCreateBuffer(uint32_t frameIndex,

+        const VkBufferCreateInfo& bufCreateInfo,

+        const VmaAllocationCreateInfo& allocCreateInfo,

+        VmaAllocation allocation);

+    void RecordCreateImage(uint32_t frameIndex,

+        const VkImageCreateInfo& imageCreateInfo,

+        const VmaAllocationCreateInfo& allocCreateInfo,

+        VmaAllocation allocation);

+    void RecordDestroyBuffer(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordDestroyImage(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordTouchAllocation(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordGetAllocationInfo(uint32_t frameIndex,

+        VmaAllocation allocation);

+    void RecordMakePoolAllocationsLost(uint32_t frameIndex,

+        VmaPool pool);

+

+private:

+    struct CallParams

+    {

+        uint32_t threadId;

+        double time;

+    };

+

+    class UserDataString

+    {

+    public:

+        UserDataString(VmaAllocationCreateFlags allocFlags, const void* pUserData);

+        const char* GetString() const { return m_Str; }

+

+    private:

+        char m_PtrStr[17];

+        const char* m_Str;

+    };

+

+    bool m_UseMutex;

+    VmaRecordFlags m_Flags;

+    FILE* m_File;

+    VMA_MUTEX m_FileMutex;

+    int64_t m_Freq;

+    int64_t m_StartCounter;

+

+    void GetBasicParams(CallParams& outParams);

+    void Flush();

+};

+

+#endif // #if VMA_RECORDING_ENABLED

+

 // Main allocator object.

 struct VmaAllocator_T

 {

@@ -4863,6 +5089,7 @@
     VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];

 

     VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo);

+    VkResult Init(const VmaAllocatorCreateInfo* pCreateInfo);

     ~VmaAllocator_T();

 

     const VkAllocationCallbacks* GetAllocationCallbacks() const

@@ -4908,6 +5135,10 @@
         return m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;

     }

 

+#if VMA_RECORDING_ENABLED

+    VmaRecorder* GetRecorder() const { return m_pRecorder; }

+#endif

+

     void GetBufferMemoryRequirements(

         VkBuffer hBuffer,

         VkMemoryRequirements& memReq,

@@ -4954,6 +5185,7 @@
     void GetPoolStats(VmaPool pool, VmaPoolStats* pPoolStats);

 

     void SetCurrentFrameIndex(uint32_t frameIndex);

+    uint32_t GetCurrentFrameIndex() const { return m_CurrentFrameIndex.load(); }

 

     void MakePoolAllocationsLost(

         VmaPool hPool,

@@ -4992,6 +5224,10 @@
 

     VmaVulkanFunctions m_VulkanFunctions;

 

+#if VMA_RECORDING_ENABLED

+    VmaRecorder* m_pRecorder;

+#endif

+

     void ImportVulkanFunctions(const VmaVulkanFunctions* pVulkanFunctions);

 

     VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);

@@ -5272,7 +5508,7 @@
     for(size_t i = 0; i < strLen; ++i)

     {

         char ch = pStr[i];

-        if(ch == '\'')

+        if(ch == '\\')

         {

             m_SB.Add("\\\\");

         }

@@ -9221,6 +9457,480 @@
 }

 

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

+// VmaRecorder

+

+#if VMA_RECORDING_ENABLED

+

+VmaRecorder::VmaRecorder() :

+    m_UseMutex(true),

+    m_Flags(0),

+    m_File(VMA_NULL),

+    m_Freq(INT64_MAX),

+    m_StartCounter(INT64_MAX)

+{

+}

+

+VkResult VmaRecorder::Init(const VmaRecordSettings& settings, bool useMutex)

+{

+    m_UseMutex = useMutex;

+    m_Flags = settings.flags;

+

+    QueryPerformanceFrequency((LARGE_INTEGER*)&m_Freq);

+    QueryPerformanceCounter((LARGE_INTEGER*)&m_StartCounter);

+

+    // Open file for writing.

+    errno_t err = fopen_s(&m_File, settings.pFilePath, "wb");

+    if(err != 0)

+    {

+        return VK_ERROR_INITIALIZATION_FAILED;

+    }

+

+    // Write header.

+    fprintf(m_File, "%s\n", "Vulkan Memory Allocator,Calls recording");

+    fprintf(m_File, "%s\n", "1,3");

+

+    return VK_SUCCESS;

+}

+

+VmaRecorder::~VmaRecorder()

+{

+    if(m_File != VMA_NULL)

+    {

+        fclose(m_File);

+    }

+}

+

+void VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaCreateAllocator\n", callParams.threadId, callParams.time, frameIndex);

+    Flush();

+}

+

+void VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaDestroyAllocator\n", callParams.threadId, callParams.time, frameIndex);

+    Flush();

+}

+

+void VmaRecorder::RecordCreatePool(uint32_t frameIndex, const VmaPoolCreateInfo& createInfo, VmaPool pool)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n", callParams.threadId, callParams.time, frameIndex,

+        createInfo.memoryTypeIndex,

+        createInfo.flags,

+        createInfo.blockSize,

+        createInfo.minBlockCount,

+        createInfo.maxBlockCount,

+        createInfo.frameInUseCount,

+        pool);

+    Flush();

+}

+

+void VmaRecorder::RecordDestroyPool(uint32_t frameIndex, VmaPool pool)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaDestroyPool,%p\n", callParams.threadId, callParams.time, frameIndex,

+        pool);

+    Flush();

+}

+

+void VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,

+        const VkMemoryRequirements& vkMemReq,

+        const VmaAllocationCreateInfo& createInfo,

+        VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(createInfo.flags, createInfo.pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        vkMemReq.size,

+        vkMemReq.alignment,

+        vkMemReq.memoryTypeBits,

+        createInfo.flags,

+        createInfo.usage,

+        createInfo.requiredFlags,

+        createInfo.preferredFlags,

+        createInfo.memoryTypeBits,

+        createInfo.pool,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,

+    const VkMemoryRequirements& vkMemReq,

+    bool requiresDedicatedAllocation,

+    bool prefersDedicatedAllocation,

+    const VmaAllocationCreateInfo& createInfo,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(createInfo.flags, createInfo.pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        vkMemReq.size,

+        vkMemReq.alignment,

+        vkMemReq.memoryTypeBits,

+        requiresDedicatedAllocation ? 1 : 0,

+        prefersDedicatedAllocation ? 1 : 0,

+        createInfo.flags,

+        createInfo.usage,

+        createInfo.requiredFlags,

+        createInfo.preferredFlags,

+        createInfo.memoryTypeBits,

+        createInfo.pool,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,

+    const VkMemoryRequirements& vkMemReq,

+    bool requiresDedicatedAllocation,

+    bool prefersDedicatedAllocation,

+    const VmaAllocationCreateInfo& createInfo,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(createInfo.flags, createInfo.pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        vkMemReq.size,

+        vkMemReq.alignment,

+        vkMemReq.memoryTypeBits,

+        requiresDedicatedAllocation ? 1 : 0,

+        prefersDedicatedAllocation ? 1 : 0,

+        createInfo.flags,

+        createInfo.usage,

+        createInfo.requiredFlags,

+        createInfo.preferredFlags,

+        createInfo.memoryTypeBits,

+        createInfo.pool,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordFreeMemory(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaFreeMemory,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,

+    VmaAllocation allocation,

+    const void* pUserData)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(

+        allocation->IsUserDataString() ? VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT : 0,

+        pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaCreateLostAllocation,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordMapMemory(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaMapMemory,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaUnmapMemory,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,

+    VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n", callParams.threadId, callParams.time, frameIndex,

+        allocation,

+        offset,

+        size);

+    Flush();

+}

+

+void VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,

+    VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n", callParams.threadId, callParams.time, frameIndex,

+        allocation,

+        offset,

+        size);

+    Flush();

+}

+

+void VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,

+    const VkBufferCreateInfo& bufCreateInfo,

+    const VmaAllocationCreateInfo& allocCreateInfo,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(allocCreateInfo.flags, allocCreateInfo.pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        bufCreateInfo.flags,

+        bufCreateInfo.size,

+        bufCreateInfo.usage,

+        bufCreateInfo.sharingMode,

+        allocCreateInfo.flags,

+        allocCreateInfo.usage,

+        allocCreateInfo.requiredFlags,

+        allocCreateInfo.preferredFlags,

+        allocCreateInfo.memoryTypeBits,

+        allocCreateInfo.pool,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordCreateImage(uint32_t frameIndex,

+    const VkImageCreateInfo& imageCreateInfo,

+    const VmaAllocationCreateInfo& allocCreateInfo,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    UserDataString userDataStr(allocCreateInfo.flags, allocCreateInfo.pUserData);

+    fprintf(m_File, "%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n", callParams.threadId, callParams.time, frameIndex,

+        imageCreateInfo.flags,

+        imageCreateInfo.imageType,

+        imageCreateInfo.format,

+        imageCreateInfo.extent.width,

+        imageCreateInfo.extent.height,

+        imageCreateInfo.extent.depth,

+        imageCreateInfo.mipLevels,

+        imageCreateInfo.arrayLayers,

+        imageCreateInfo.samples,

+        imageCreateInfo.tiling,

+        imageCreateInfo.usage,

+        imageCreateInfo.sharingMode,

+        imageCreateInfo.initialLayout,

+        allocCreateInfo.flags,

+        allocCreateInfo.usage,

+        allocCreateInfo.requiredFlags,

+        allocCreateInfo.preferredFlags,

+        allocCreateInfo.memoryTypeBits,

+        allocCreateInfo.pool,

+        allocation,

+        userDataStr.GetString());

+    Flush();

+}

+

+void VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaDestroyBuffer,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordDestroyImage(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaDestroyImage,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaTouchAllocation,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,

+    VmaAllocation allocation)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaGetAllocationInfo,%p\n", callParams.threadId, callParams.time, frameIndex,

+        allocation);

+    Flush();

+}

+

+void VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,

+    VmaPool pool)

+{

+    CallParams callParams;

+    GetBasicParams(callParams);

+

+    VmaMutexLock lock(m_FileMutex, m_UseMutex);

+    fprintf(m_File, "%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n", callParams.threadId, callParams.time, frameIndex,

+        pool);

+    Flush();

+}

+

+VmaRecorder::UserDataString::UserDataString(VmaAllocationCreateFlags allocFlags, const void* pUserData)

+{

+    if(pUserData != VMA_NULL)

+    {

+        if((allocFlags & VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT) != 0)

+        {

+            m_Str = (const char*)pUserData;

+        }

+        else

+        {

+            sprintf_s(m_PtrStr, "%p", pUserData);

+            m_Str = m_PtrStr;

+        }

+    }

+    else

+    {

+        m_Str = "";

+    }

+}

+

+void VmaRecorder::WriteConfiguration(

+    const VkPhysicalDeviceProperties& devProps,

+    const VkPhysicalDeviceMemoryProperties& memProps,

+    bool dedicatedAllocationExtensionEnabled)

+{

+    fprintf(m_File, "Config,Begin\n");

+

+    fprintf(m_File, "PhysicalDevice,apiVersion,%u\n", devProps.apiVersion);

+    fprintf(m_File, "PhysicalDevice,driverVersion,%u\n", devProps.driverVersion);

+    fprintf(m_File, "PhysicalDevice,vendorID,%u\n", devProps.vendorID);

+    fprintf(m_File, "PhysicalDevice,deviceID,%u\n", devProps.deviceID);

+    fprintf(m_File, "PhysicalDevice,deviceType,%u\n", devProps.deviceType);

+    fprintf(m_File, "PhysicalDevice,deviceName,%s\n", devProps.deviceName);

+

+    fprintf(m_File, "PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n", devProps.limits.maxMemoryAllocationCount);

+    fprintf(m_File, "PhysicalDeviceLimits,bufferImageGranularity,%llu\n", devProps.limits.bufferImageGranularity);

+    fprintf(m_File, "PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n", devProps.limits.nonCoherentAtomSize);

+

+    fprintf(m_File, "PhysicalDeviceMemory,HeapCount,%u\n", memProps.memoryHeapCount);

+    for(uint32_t i = 0; i < memProps.memoryHeapCount; ++i)

+    {

+        fprintf(m_File, "PhysicalDeviceMemory,Heap,%u,size,%llu\n", i, memProps.memoryHeaps[i].size);

+        fprintf(m_File, "PhysicalDeviceMemory,Heap,%u,flags,%u\n", i, memProps.memoryHeaps[i].flags);

+    }

+    fprintf(m_File, "PhysicalDeviceMemory,TypeCount,%u\n", memProps.memoryTypeCount);

+    for(uint32_t i = 0; i < memProps.memoryTypeCount; ++i)

+    {

+        fprintf(m_File, "PhysicalDeviceMemory,Type,%u,heapIndex,%u\n", i, memProps.memoryTypes[i].heapIndex);

+        fprintf(m_File, "PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n", i, memProps.memoryTypes[i].propertyFlags);

+    }

+

+    fprintf(m_File, "Extension,VK_KHR_dedicated_allocation,%u\n", dedicatedAllocationExtensionEnabled ? 1 : 0);

+

+    fprintf(m_File, "Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n", VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);

+    fprintf(m_File, "Macro,VMA_DEBUG_ALIGNMENT,%llu\n", (VkDeviceSize)VMA_DEBUG_ALIGNMENT);

+    fprintf(m_File, "Macro,VMA_DEBUG_MARGIN,%llu\n", (VkDeviceSize)VMA_DEBUG_MARGIN);

+    fprintf(m_File, "Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n", VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);

+    fprintf(m_File, "Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n", VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);

+    fprintf(m_File, "Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n", VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);

+    fprintf(m_File, "Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n", (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);

+    fprintf(m_File, "Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n", (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);

+    fprintf(m_File, "Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n", (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);

+

+    fprintf(m_File, "Config,End\n");

+}

+

+void VmaRecorder::GetBasicParams(CallParams& outParams)

+{

+    outParams.threadId = GetCurrentThreadId();

+

+    LARGE_INTEGER counter;

+    QueryPerformanceCounter(&counter);

+    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;

+}

+

+void VmaRecorder::Flush()

+{

+    if((m_Flags & VMA_RECORD_FLUSH_AFTER_CALL_BIT) != 0)

+    {

+        fflush(m_File);

+    }

+}

+

+#endif // #if VMA_RECORDING_ENABLED

+

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

 // VmaAllocator_T

 

 VmaAllocator_T::VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo) :

@@ -9235,6 +9945,9 @@
     m_CurrentFrameIndex(0),

     m_Pools(VmaStlAllocator<VmaPool>(GetAllocationCallbacks())),

     m_NextPoolId(0)

+#if VMA_RECORDING_ENABLED

+    ,m_pRecorder(VMA_NULL)

+#endif

 {

     if(VMA_DEBUG_DETECT_CORRUPTION)

     {

@@ -9314,8 +10027,44 @@
     }

 }

 

+VkResult VmaAllocator_T::Init(const VmaAllocatorCreateInfo* pCreateInfo)

+{

+    VkResult res = VK_SUCCESS;

+

+    if(pCreateInfo->pRecordSettings != VMA_NULL &&

+        !VmaStrIsEmpty(pCreateInfo->pRecordSettings->pFilePath))

+    {

+#if VMA_RECORDING_ENABLED

+        m_pRecorder = vma_new(this, VmaRecorder)();

+        res = m_pRecorder->Init(*pCreateInfo->pRecordSettings, m_UseMutex);

+        if(res != VK_SUCCESS)

+        {

+            return res;

+        }

+        m_pRecorder->WriteConfiguration(

+            m_PhysicalDeviceProperties,

+            m_MemProps,

+            m_UseKhrDedicatedAllocation);

+        m_pRecorder->RecordCreateAllocator(GetCurrentFrameIndex());

+#else

+        VMA_ASSERT(0 && "VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.");

+        return VK_ERROR_FEATURE_NOT_PRESENT;

+#endif

+    }

+

+    return res;

+}

+

 VmaAllocator_T::~VmaAllocator_T()

 {

+#if VMA_RECORDING_ENABLED

+    if(m_pRecorder != VMA_NULL)

+    {

+        m_pRecorder->RecordDestroyAllocator(GetCurrentFrameIndex());

+        vma_delete(this, m_pRecorder);

+    }

+#endif

+    

     VMA_ASSERT(m_Pools.empty());

 

     for(size_t i = GetMemoryTypeCount(); i--; )

@@ -10623,32 +11372,6 @@
 

 #endif // #if VMA_STATS_STRING_ENABLED

 

-static VkResult AllocateMemoryForImage(

-    VmaAllocator allocator,

-    VkImage image,

-    const VmaAllocationCreateInfo* pAllocationCreateInfo,

-    VmaSuballocationType suballocType,

-    VmaAllocation* pAllocation)

-{

-    VMA_ASSERT(allocator && (image != VK_NULL_HANDLE) && pAllocationCreateInfo && pAllocation);

-    

-    VkMemoryRequirements vkMemReq = {};

-    bool requiresDedicatedAllocation = false;

-    bool prefersDedicatedAllocation  = false;

-    allocator->GetImageMemoryRequirements(image, vkMemReq,

-        requiresDedicatedAllocation, prefersDedicatedAllocation);

-

-    return allocator->AllocateMemory(

-        vkMemReq,

-        requiresDedicatedAllocation,

-        prefersDedicatedAllocation,

-        VK_NULL_HANDLE, // dedicatedBuffer

-        image, // dedicatedImage

-        *pAllocationCreateInfo,

-        suballocType,

-        pAllocation);

-}

-

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

 // Public interface

 

@@ -10659,7 +11382,7 @@
     VMA_ASSERT(pCreateInfo && pAllocator);

     VMA_DEBUG_LOG("vmaCreateAllocator");

     *pAllocator = vma_new(pCreateInfo->pAllocationCallbacks, VmaAllocator_T)(pCreateInfo);

-    return VK_SUCCESS;

+    return (*pAllocator)->Init(pCreateInfo);

 }

 

 void vmaDestroyAllocator(

@@ -11004,12 +11727,21 @@
 	VmaPool* pPool)

 {

     VMA_ASSERT(allocator && pCreateInfo && pPool);

-

+    

     VMA_DEBUG_LOG("vmaCreatePool");

-

+    

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

-

-    return allocator->CreatePool(pCreateInfo, pPool);

+    

+    VkResult res = allocator->CreatePool(pCreateInfo, pPool);

+    

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordCreatePool(allocator->GetCurrentFrameIndex(), *pCreateInfo, *pPool);

+    }

+#endif

+    

+    return res;

 }

 

 void vmaDestroyPool(

@@ -11017,15 +11749,22 @@
     VmaPool pool)

 {

     VMA_ASSERT(allocator);

-

+    

     if(pool == VK_NULL_HANDLE)

     {

         return;

     }

-

+    

     VMA_DEBUG_LOG("vmaDestroyPool");

-

+    

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

+    

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordDestroyPool(allocator->GetCurrentFrameIndex(), pool);

+    }

+#endif

 

     allocator->DestroyPool(pool);

 }

@@ -11051,6 +11790,13 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordMakePoolAllocationsLost(allocator->GetCurrentFrameIndex(), pool);

+    }

+#endif

+

     allocator->MakePoolAllocationsLost(pool, pLostAllocationCount);

 }

 

@@ -11088,7 +11834,18 @@
         VMA_SUBALLOCATION_TYPE_UNKNOWN,

         pAllocation);

 

-    if(pAllocationInfo && result == VK_SUCCESS)

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordAllocateMemory(

+            allocator->GetCurrentFrameIndex(),

+            *pVkMemoryRequirements,

+            *pCreateInfo,

+            *pAllocation);

+    }

+#endif

+        

+    if(pAllocationInfo != VMA_NULL && result == VK_SUCCESS)

     {

         allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);

     }

@@ -11126,6 +11883,19 @@
         VMA_SUBALLOCATION_TYPE_BUFFER,

         pAllocation);

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordAllocateMemoryForBuffer(

+            allocator->GetCurrentFrameIndex(),

+            vkMemReq,

+            requiresDedicatedAllocation,

+            prefersDedicatedAllocation,

+            *pCreateInfo,

+            *pAllocation);

+    }

+#endif

+

     if(pAllocationInfo && result == VK_SUCCESS)

     {

         allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);

@@ -11147,13 +11917,35 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

-    VkResult result = AllocateMemoryForImage(

-        allocator,

-        image,

-        pCreateInfo,

+    VkMemoryRequirements vkMemReq = {};

+    bool requiresDedicatedAllocation = false;

+    bool prefersDedicatedAllocation  = false;

+    allocator->GetImageMemoryRequirements(image, vkMemReq,

+        requiresDedicatedAllocation, prefersDedicatedAllocation);

+

+    VkResult result = allocator->AllocateMemory(

+        vkMemReq,

+        requiresDedicatedAllocation,

+        prefersDedicatedAllocation,

+        VK_NULL_HANDLE, // dedicatedBuffer

+        image, // dedicatedImage

+        *pCreateInfo,

         VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,

         pAllocation);

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordAllocateMemoryForImage(

+            allocator->GetCurrentFrameIndex(),

+            vkMemReq,

+            requiresDedicatedAllocation,

+            prefersDedicatedAllocation,

+            *pCreateInfo,

+            *pAllocation);

+    }

+#endif

+

     if(pAllocationInfo && result == VK_SUCCESS)

     {

         allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);

@@ -11167,12 +11959,26 @@
     VmaAllocation allocation)

 {

     VMA_ASSERT(allocator);

-    VMA_DEBUG_LOG("vmaFreeMemory");

-    VMA_DEBUG_GLOBAL_MUTEX_LOCK

-    if(allocation != VK_NULL_HANDLE)

+    

+    if(allocation == VK_NULL_HANDLE)

     {

-        allocator->FreeMemory(allocation);

+        return;

     }

+    

+    VMA_DEBUG_LOG("vmaFreeMemory");

+    

+    VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordFreeMemory(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+    

+    allocator->FreeMemory(allocation);

 }

 

 void vmaGetAllocationInfo(

@@ -11184,6 +11990,15 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordGetAllocationInfo(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

     allocator->GetAllocationInfo(allocation, pAllocationInfo);

 }

 

@@ -11195,6 +12010,15 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordTouchAllocation(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

     return allocator->TouchAllocation(allocation);

 }

 

@@ -11208,6 +12032,16 @@
     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

     allocation->SetUserData(allocator, pUserData);

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordSetAllocationUserData(

+            allocator->GetCurrentFrameIndex(),

+            allocation,

+            pUserData);

+    }

+#endif

 }

 

 void vmaCreateLostAllocation(

@@ -11219,6 +12053,15 @@
     VMA_DEBUG_GLOBAL_MUTEX_LOCK;

 

     allocator->CreateLostAllocation(pAllocation);

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordCreateLostAllocation(

+            allocator->GetCurrentFrameIndex(),

+            *pAllocation);

+    }

+#endif

 }

 

 VkResult vmaMapMemory(

@@ -11230,7 +12073,18 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

-    return allocator->Map(allocation, ppData);

+    VkResult res = allocator->Map(allocation, ppData);

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordMapMemory(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

+    return res;

 }

 

 void vmaUnmapMemory(

@@ -11241,6 +12095,15 @@
 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordUnmapMemory(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

     allocator->Unmap(allocation);

 }

 

@@ -11253,6 +12116,15 @@
     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

     allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordFlushAllocation(

+            allocator->GetCurrentFrameIndex(),

+            allocation, offset, size);

+    }

+#endif

 }

 

 void vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)

@@ -11264,6 +12136,15 @@
     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

     allocator->FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordInvalidateAllocation(

+            allocator->GetCurrentFrameIndex(),

+            allocation, offset, size);

+    }

+#endif

 }

 

 VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits)

@@ -11354,8 +12235,8 @@
         allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,

             requiresDedicatedAllocation, prefersDedicatedAllocation);

 

-         // Make sure alignment requirements for specific buffer usages reported

-         // in Physical Device Properties are included in alignment reported by memory requirements.

+        // Make sure alignment requirements for specific buffer usages reported

+        // in Physical Device Properties are included in alignment reported by memory requirements.

         if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)

         {

            VMA_ASSERT(vkMemReq.alignment %

@@ -11382,6 +12263,18 @@
             *pAllocationCreateInfo,

             VMA_SUBALLOCATION_TYPE_BUFFER,

             pAllocation);

+

+#if VMA_RECORDING_ENABLED

+        if(allocator->GetRecorder() != VMA_NULL)

+        {

+            allocator->GetRecorder()->RecordCreateBuffer(

+                allocator->GetCurrentFrameIndex(),

+                *pBufferCreateInfo,

+                *pAllocationCreateInfo,

+                *pAllocation);

+        }

+#endif

+

         if(res >= 0)

         {

             // 3. Bind buffer with memory.

@@ -11396,6 +12289,7 @@
                 {

                     allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);

                 }

+

                 return VK_SUCCESS;

             }

             allocator->FreeMemory(*pAllocation);

@@ -11417,12 +12311,30 @@
     VmaAllocation allocation)

 {

     VMA_ASSERT(allocator);

+

+    if(buffer == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)

+    {

+        return;

+    }

+

     VMA_DEBUG_LOG("vmaDestroyBuffer");

+

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordDestroyBuffer(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

     if(buffer != VK_NULL_HANDLE)

     {

         (*allocator->GetVulkanFunctions().vkDestroyBuffer)(allocator->m_hDevice, buffer, allocator->GetAllocationCallbacks());

     }

+

     if(allocation != VK_NULL_HANDLE)

     {

         allocator->FreeMemory(allocation);

@@ -11459,7 +12371,33 @@
             VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;

         

         // 2. Allocate memory using allocator.

-        res = AllocateMemoryForImage(allocator, *pImage, pAllocationCreateInfo, suballocType, pAllocation);

+        VkMemoryRequirements vkMemReq = {};

+        bool requiresDedicatedAllocation = false;

+        bool prefersDedicatedAllocation  = false;

+        allocator->GetImageMemoryRequirements(*pImage, vkMemReq,

+            requiresDedicatedAllocation, prefersDedicatedAllocation);

+

+        res = allocator->AllocateMemory(

+            vkMemReq,

+            requiresDedicatedAllocation,

+            prefersDedicatedAllocation,

+            VK_NULL_HANDLE, // dedicatedBuffer

+            *pImage, // dedicatedImage

+            *pAllocationCreateInfo,

+            suballocType,

+            pAllocation);

+

+#if VMA_RECORDING_ENABLED

+        if(allocator->GetRecorder() != VMA_NULL)

+        {

+            allocator->GetRecorder()->RecordCreateImage(

+                allocator->GetCurrentFrameIndex(),

+                *pImageCreateInfo,

+                *pAllocationCreateInfo,

+                *pAllocation);

+        }

+#endif

+

         if(res >= 0)

         {

             // 3. Bind image with memory.

@@ -11474,6 +12412,7 @@
                 {

                     allocator->GetAllocationInfo(*pAllocation, pAllocationInfo);

                 }

+

                 return VK_SUCCESS;

             }

             allocator->FreeMemory(*pAllocation);

@@ -11495,8 +12434,25 @@
     VmaAllocation allocation)

 {

     VMA_ASSERT(allocator);

+

+    if(image == VK_NULL_HANDLE && allocation == VK_NULL_HANDLE)

+    {

+        return;

+    }

+

     VMA_DEBUG_LOG("vmaDestroyImage");

+

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+#if VMA_RECORDING_ENABLED

+    if(allocator->GetRecorder() != VMA_NULL)

+    {

+        allocator->GetRecorder()->RecordDestroyImage(

+            allocator->GetCurrentFrameIndex(),

+            allocation);

+    }

+#endif

+

     if(image != VK_NULL_HANDLE)

     {

         (*allocator->GetVulkanFunctions().vkDestroyImage)(allocator->m_hDevice, image, allocator->GetAllocationCallbacks());