Finished major refactoring of the statistics and budget API. COMPATIBILITY BREAKING!

See structures: Statistics, DetailedStatistics, TotalStatistics, Budget.
Functions: Allocator::GetMemoryCapacity, GetBudget, CalculateStatistics,
Pool::GetStatistics, CalculateStatistics,
VirtualAllocation::GetStatistics, CalculateStatistics.

Updated and rebuilt the docs.
diff --git a/docs/html/_d3_d12_mem_alloc_8h.html b/docs/html/_d3_d12_mem_alloc_8h.html
index b2e5b69..7517ead 100644
--- a/docs/html/_d3_d12_mem_alloc_8h.html
+++ b/docs/html/_d3_d12_mem_alloc_8h.html
@@ -88,6 +88,18 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a>.  <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.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_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total.  <a href="struct_d3_d12_m_a_1_1_statistics.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_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a>.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.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_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from current state of the allocator - total memory usage across all memory heaps and segments.  <a href="struct_d3_d12_m_a_1_1_total_statistics.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_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget for a specific memory segment group.  <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html">D3D12MA::VirtualAllocation</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a>.  <a href="struct_d3_d12_m_a_1_1_virtual_allocation.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -103,15 +115,6 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a>.  <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.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_d3_d12_m_a_1_1_stat_info.html">D3D12MA::StatInfo</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage in entire allocator.  <a href="struct_d3_d12_m_a_1_1_stat_info.html#details">More...</a><br /></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_stats.html">D3D12MA::Stats</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from the current state of the allocator.  <a href="struct_d3_d12_m_a_1_1_stats.html#details">More...</a><br /></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory.  <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a><br /></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Represents main object of this library initialized for particular <code>ID3D12Device</code>.  <a href="class_d3_d12_m_a_1_1_allocator.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -166,9 +169,8 @@
 <tr class="memdesc:abbad31a7e0b3d09d77f3fb704b77645e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with ALLOCATION_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645e">More...</a><br /></td></tr>
 <tr class="separator:abbad31a7e0b3d09d77f3fb704b77645e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a919d8545365d6b7209a964f2b99936d1"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">D3D12MA::POOL_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02">D3D12MA::POOL_FLAG_NONE</a> = 0
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a">D3D12MA::POOL_FLAG_ALGORITHM_TLSF</a> = 0x1
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">D3D12MA::POOL_FLAG_ALGORITHM_LINEAR</a> = 0x2
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">D3D12MA::POOL_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_TLSF | POOL_FLAG_ALGORITHM_LINEAR
+, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">D3D12MA::POOL_FLAG_ALGORITHM_LINEAR</a> = 0x1
+, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">D3D12MA::POOL_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_LINEAR
  }</td></tr>
 <tr class="memdesc:a919d8545365d6b7209a964f2b99936d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with POOL_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">More...</a><br /></td></tr>
 <tr class="separator:a919d8545365d6b7209a964f2b99936d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -179,7 +181,6 @@
 <tr class="memdesc:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with ALLOCATOR_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916">More...</a><br /></td></tr>
 <tr class="separator:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a578329923a103be086ac52e3bed2085d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d">D3D12MA::VIRTUAL_BLOCK_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d">D3D12MA::VIRTUAL_BLOCK_FLAG_NONE</a> = 0
-, <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF</a> = POOL_FLAG_ALGORITHM_TLSF
 , <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR</a> = POOL_FLAG_ALGORITHM_LINEAR
 , <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_MASK
  }</td></tr>
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
index d3dc7d2..795c76c 100644
--- a/docs/html/annotated.html
+++ b/docs/html/annotated.html
@@ -73,16 +73,17 @@
 <tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">ALLOCATION_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a> </td></tr>
 <tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocator.html" target="_self">Allocator</a></td><td class="desc">Represents main object of this library initialized for particular <code>ID3D12Device</code> </td></tr>
 <tr id="row_0_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html" target="_self">ALLOCATOR_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a> </td></tr>
-<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">Budget</a></td><td class="desc">Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory </td></tr>
-<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">Pool</a></td><td class="desc">Custom memory pool </td></tr>
-<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
-<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html" target="_self">StatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
-<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stats.html" target="_self">Stats</a></td><td class="desc">General statistics from the current state of the allocator </td></tr>
-<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
-<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a> </td></tr>
-<tr id="row_0_12_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a> </td></tr>
-<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
-<tr id="row_0_14_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">Budget</a></td><td class="desc">Statistics of current memory usage and available budget for a specific memory segment group </td></tr>
+<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html" target="_self">DetailedStatistics</a></td><td class="desc">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a> </td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">Pool</a></td><td class="desc">Custom memory pool </td></tr>
+<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
+<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" target="_self">Statistics</a></td><td class="desc">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total </td></tr>
+<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html" target="_self">TotalStatistics</a></td><td class="desc">General statistics from current state of the allocator - total memory usage across all memory heaps and segments </td></tr>
+<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
+<tr id="row_0_12_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a> </td></tr>
+<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a> </td></tr>
+<tr id="row_0_14_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
+<tr id="row_0_15_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/class_d3_d12_m_a_1_1_allocator-members.html b/docs/html/class_d3_d12_m_a_1_1_allocator-members.html
index 2928ea6..061f063 100644
--- a/docs/html/class_d3_d12_m_a_1_1_allocator-members.html
+++ b/docs/html/class_d3_d12_m_a_1_1_allocator-members.html
@@ -74,7 +74,7 @@
 <table class="directory">
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#acb8a10a5ea30171ce60128286aec5ee2">AllocateMemory</a>(const ALLOCATION_DESC *pAllocDesc, const D3D12_RESOURCE_ALLOCATION_INFO *pAllocInfo, Allocation **ppAllocation)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a29716b3084916abed7793bf2ec4b65db">BuildStatsString</a>(WCHAR **ppStatsString, BOOL DetailedMap) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b">CalculateStats</a>(Stats *pStats)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22">CalculateStatistics</a>(TotalStatistics *pStats)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ab45536f92410aedb7be44ea36b1b4717">CreateAliasingResource</a>(Allocation *pAllocation, UINT64 AllocationLocalOffset, const D3D12_RESOURCE_DESC *pResourceDesc, D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue, REFIID riidResource, void **ppvResource)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a458f044fdc81e4a0b147e99ffcf73459">CreateAllocator</a></td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515">CreatePool</a>(const POOL_DESC *pPoolDesc, Pool **ppPool)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
@@ -82,11 +82,12 @@
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a7a1c79c79a7a573c438aa45c4a531b96">CreateResource2</a>(const ALLOCATION_DESC *pAllocDesc, const D3D12_RESOURCE_DESC1 *pResourceDesc, D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue, Allocation **ppAllocation, REFIID riidResource, void **ppvResource)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a968f13f23d03e50cc50b87835b6d5a85">D3D12MA_DELETE</a></td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a8392663494384c16d8bfa12b827b4f9c">FreeStatsString</a>(WCHAR *pStatsString) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601">GetBudget</a>(Budget *pGpuBudget, Budget *pCpuBudget)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144">GetBudget</a>(Budget *pLocalBudget, Budget *pNonLocalBudget)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ae276d2358a58a36f8c6639f837f29be5">GetD3D12Options</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a08210561b92c4bd7ede9dd7beba4bb80">IsCacheCoherentUMA</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0">IsUMA</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11">SetCurrentFrameIndex</a>(UINT frameIndex)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc">GetMemoryCapacity</a>(UINT memorySegmentGroup) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a08210561b92c4bd7ede9dd7beba4bb80">IsCacheCoherentUMA</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0">IsUMA</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11">SetCurrentFrameIndex</a>(UINT frameIndex)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</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/class_d3_d12_m_a_1_1_allocator.html b/docs/html/class_d3_d12_m_a_1_1_allocator.html
index 00dbed1..f55cee6 100644
--- a/docs/html/class_d3_d12_m_a_1_1_allocator.html
+++ b/docs/html/class_d3_d12_m_a_1_1_allocator.html
@@ -95,6 +95,9 @@
 <tr class="memitem:a08210561b92c4bd7ede9dd7beba4bb80"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a08210561b92c4bd7ede9dd7beba4bb80">IsCacheCoherentUMA</a> () const</td></tr>
 <tr class="memdesc:a08210561b92c4bd7ede9dd7beba4bb80"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns true if <code>D3D12_FEATURE_DATA_ARCHITECTURE1::CacheCoherentUMA</code> was found to be true.  <a href="class_d3_d12_m_a_1_1_allocator.html#a08210561b92c4bd7ede9dd7beba4bb80">More...</a><br /></td></tr>
 <tr class="separator:a08210561b92c4bd7ede9dd7beba4bb80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a434ae3147209953253da26687bfd62dc"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc">GetMemoryCapacity</a> (UINT memorySegmentGroup) const</td></tr>
+<tr class="memdesc:a434ae3147209953253da26687bfd62dc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns total amount of memory of specific segment group, in bytes.  <a href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc">More...</a><br /></td></tr>
+<tr class="separator:a434ae3147209953253da26687bfd62dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa37d6b9fe8ea0864f7a35b9d68e8345a"><td class="memItemLeft" align="right" valign="top">HRESULT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a">CreateResource</a> (const <a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">ALLOCATION_DESC</a> *pAllocDesc, const D3D12_RESOURCE_DESC *pResourceDesc, D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue, <a class="el" href="class_d3_d12_m_a_1_1_allocation.html">Allocation</a> **ppAllocation, REFIID riidResource, void **ppvResource)</td></tr>
 <tr class="memdesc:aa37d6b9fe8ea0864f7a35b9d68e8345a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation function.  <a href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a">More...</a><br /></td></tr>
 <tr class="separator:aa37d6b9fe8ea0864f7a35b9d68e8345a"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -113,12 +116,12 @@
 <tr class="memitem:a468ba0c93121eaaee402b08775f1dd11"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11">SetCurrentFrameIndex</a> (UINT frameIndex)</td></tr>
 <tr class="memdesc:a468ba0c93121eaaee402b08775f1dd11"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the index of the current frame.  <a href="class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11">More...</a><br /></td></tr>
 <tr class="separator:a468ba0c93121eaaee402b08775f1dd11"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:addedcd0067319ec566042f5cb520843b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b">CalculateStats</a> (<a class="el" href="struct_d3_d12_m_a_1_1_stats.html">Stats</a> *pStats)</td></tr>
-<tr class="memdesc:addedcd0067319ec566042f5cb520843b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from the current state of the allocator.  <a href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b">More...</a><br /></td></tr>
-<tr class="separator:addedcd0067319ec566042f5cb520843b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abe927bd3ad6930111d4d9408515b9601"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601">GetBudget</a> (<a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *pGpuBudget, <a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *pCpuBudget)</td></tr>
-<tr class="memdesc:abe927bd3ad6930111d4d9408515b9601"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves information about current memory budget.  <a href="class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601">More...</a><br /></td></tr>
-<tr class="separator:abe927bd3ad6930111d4d9408515b9601"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ac113daec5f6ef28ecb1786cf544144"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144">GetBudget</a> (<a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *pLocalBudget, <a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *pNonLocalBudget)</td></tr>
+<tr class="memdesc:a1ac113daec5f6ef28ecb1786cf544144"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves information about current memory usage and budget.  <a href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144">More...</a><br /></td></tr>
+<tr class="separator:a1ac113daec5f6ef28ecb1786cf544144"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99db00df909963573a976c203b107d22"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22">CalculateStatistics</a> (<a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a> *pStats)</td></tr>
+<tr class="memdesc:a99db00df909963573a976c203b107d22"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from current state of the allocator.  <a href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22">More...</a><br /></td></tr>
+<tr class="separator:a99db00df909963573a976c203b107d22"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a29716b3084916abed7793bf2ec4b65db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a29716b3084916abed7793bf2ec4b65db">BuildStatsString</a> (WCHAR **ppStatsString, BOOL DetailedMap) const</td></tr>
 <tr class="memdesc:a29716b3084916abed7793bf2ec4b65db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Builds and returns statistics as a string in JSON format.  <a href="class_d3_d12_m_a_1_1_allocator.html#a29716b3084916abed7793bf2ec4b65db">More...</a><br /></td></tr>
 <tr class="separator:a29716b3084916abed7793bf2ec4b65db"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -208,23 +211,25 @@
 
 </div>
 </div>
-<a id="addedcd0067319ec566042f5cb520843b" name="addedcd0067319ec566042f5cb520843b"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#addedcd0067319ec566042f5cb520843b">&#9670;&nbsp;</a></span>CalculateStats()</h2>
+<a id="a99db00df909963573a976c203b107d22" name="a99db00df909963573a976c203b107d22"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a99db00df909963573a976c203b107d22">&#9670;&nbsp;</a></span>CalculateStatistics()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void D3D12MA::Allocator::CalculateStats </td>
+          <td class="memname">void D3D12MA::Allocator::CalculateStatistics </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_stats.html">Stats</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a> *&#160;</td>
           <td class="paramname"><em>pStats</em></td><td>)</td>
           <td></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
-<p>Retrieves statistics from the current state of the allocator. </p>
+<p>Retrieves statistics from current state of the allocator. </p>
+<p >This function is called "calculate" not "get" because it has to traverse all internal data structures, so it may be quite slow. Use it for debugging purposes. For faster but more brief statistics suitable to be called every frame or every allocation, use <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144" title="Retrieves information about current memory usage and budget.">GetBudget()</a>.</p>
+<p >Note that when using allocator from multiple threads, returned information may immediately become outdated. </p>
 
 </div>
 </div>
@@ -489,8 +494,8 @@
 
 </div>
 </div>
-<a id="abe927bd3ad6930111d4d9408515b9601" name="abe927bd3ad6930111d4d9408515b9601"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#abe927bd3ad6930111d4d9408515b9601">&#9670;&nbsp;</a></span>GetBudget()</h2>
+<a id="a1ac113daec5f6ef28ecb1786cf544144" name="a1ac113daec5f6ef28ecb1786cf544144"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ac113daec5f6ef28ecb1786cf544144">&#9670;&nbsp;</a></span>GetBudget()</h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -499,13 +504,13 @@
           <td class="memname">void D3D12MA::Allocator::GetBudget </td>
           <td>(</td>
           <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *&#160;</td>
-          <td class="paramname"><em>pGpuBudget</em>, </td>
+          <td class="paramname"><em>pLocalBudget</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
           <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> *&#160;</td>
-          <td class="paramname"><em>pCpuBudget</em>&#160;</td>
+          <td class="paramname"><em>pNonLocalBudget</em>&#160;</td>
         </tr>
         <tr>
           <td></td>
@@ -515,15 +520,27 @@
       </table>
 </div><div class="memdoc">
 
-<p>Retrieves information about current memory budget. </p>
+<p>Retrieves information about current memory usage and budget. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
-    <tr><td class="paramdir">[out]</td><td class="paramname">pGpuBudget</td><td>Optional, can be null. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pCpuBudget</td><td>Optional, can be null.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pLocalBudget</td><td>Optional, can be null. </td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pNonLocalBudget</td><td>Optional, can be null.</td></tr>
   </table>
   </dd>
 </dl>
-<p>This function is called "get" not "calculate" because it is very fast, suitable to be called every frame or every allocation. For more detailed statistics use <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b" title="Retrieves statistics from the current state of the allocator.">CalculateStats()</a>.</p>
+<ul>
+<li>When <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0" title="Returns true if D3D12_FEATURE_DATA_ARCHITECTURE1::UMA was found to be true.">IsUMA()</a> <code>== FALSE</code> (discrete graphics card):<ul>
+<li><code>pLocalBudget</code> returns the budget of the video memory.</li>
+<li><code>pNonLocalBudget</code> returns the budget of the system memory available for D3D12 resources.</li>
+</ul>
+</li>
+<li>When <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0" title="Returns true if D3D12_FEATURE_DATA_ARCHITECTURE1::UMA was found to be true.">IsUMA()</a> <code>== TRUE</code> (integrated graphics chip):<ul>
+<li><code>pLocalBudget</code> returns the budget of the shared memory available for all D3D12 resources. All memory is considered "local".</li>
+<li><code>pNonLocalBudget</code> is not applicable and returns zeros.</li>
+</ul>
+</li>
+</ul>
+<p >This function is called "get" not "calculate" because it is very fast, suitable to be called every frame or every allocation. For more detailed statistics use <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22" title="Retrieves statistics from current state of the allocator.">CalculateStatistics()</a>.</p>
 <p >Note that when using allocator from multiple threads, returned information may immediately become outdated. </p>
 
 </div>
@@ -547,6 +564,45 @@
 
 </div>
 </div>
+<a id="a434ae3147209953253da26687bfd62dc" name="a434ae3147209953253da26687bfd62dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a434ae3147209953253da26687bfd62dc">&#9670;&nbsp;</a></span>GetMemoryCapacity()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::Allocator::GetMemoryCapacity </td>
+          <td>(</td>
+          <td class="paramtype">UINT&#160;</td>
+          <td class="paramname"><em>memorySegmentGroup</em></td><td>)</td>
+          <td> const</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns total amount of memory of specific segment group, in bytes. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">memorySegmentGroup</td><td>use <code>DXGI_MEMORY_SEGMENT_GROUP_LOCAL</code> or DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL`.</td></tr>
+  </table>
+  </dd>
+</dl>
+<p>This information is taken from <code>DXGI_ADAPTER_DESC</code>. It is not recommended to use this number. You should preferably call <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144" title="Retrieves information about current memory usage and budget.">GetBudget()</a> and limit memory usage to <a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71" title="Estimated amount of memory available to the program.">D3D12MA::Budget::BudgetBytes</a> instead.</p>
+<ul>
+<li>When <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0" title="Returns true if D3D12_FEATURE_DATA_ARCHITECTURE1::UMA was found to be true.">IsUMA()</a> <code>== FALSE</code> (discrete graphics card):<ul>
+<li><code>GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_LOCAL)</code> returns the size of the video memory.</li>
+<li><code>GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)</code> returns the size of the system memory available for D3D12 resources.</li>
+</ul>
+</li>
+<li>When <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a9e742884bd45dd7f01193d13fcd05af0" title="Returns true if D3D12_FEATURE_DATA_ARCHITECTURE1::UMA was found to be true.">IsUMA()</a> <code>== TRUE</code> (integrated graphics chip):<ul>
+<li><code>GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_LOCAL)</code> returns the size of the shared memory available for all D3D12 resources. All memory is considered "local".</li>
+<li><code>GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)</code> is not applicable and returns 0. </li>
+</ul>
+</li>
+</ul>
+
+</div>
+</div>
 <a id="a08210561b92c4bd7ede9dd7beba4bb80" name="a08210561b92c4bd7ede9dd7beba4bb80"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a08210561b92c4bd7ede9dd7beba4bb80">&#9670;&nbsp;</a></span>IsCacheCoherentUMA()</h2>
 
diff --git a/docs/html/class_d3_d12_m_a_1_1_pool-members.html b/docs/html/class_d3_d12_m_a_1_1_pool-members.html
index 4d64509..6c47bc8 100644
--- a/docs/html/class_d3_d12_m_a_1_1_pool-members.html
+++ b/docs/html/class_d3_d12_m_a_1_1_pool-members.html
@@ -72,11 +72,12 @@
 
 <p>This is the complete list of members for <a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e">CalculateStats</a>(StatInfo *pStats)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910">CalculateStatistics</a>(DetailedStatistics *pStats)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a968f13f23d03e50cc50b87835b6d5a85">D3D12MA_DELETE</a></td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028">GetDesc</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b">GetName</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b">SetName</a>(LPCWSTR Name)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91">GetStatistics</a>(Statistics *pStats)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b">SetName</a>(LPCWSTR Name)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</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/class_d3_d12_m_a_1_1_pool.html b/docs/html/class_d3_d12_m_a_1_1_pool.html
index 6831db5..1ae8bee 100644
--- a/docs/html/class_d3_d12_m_a_1_1_pool.html
+++ b/docs/html/class_d3_d12_m_a_1_1_pool.html
@@ -89,9 +89,12 @@
 <tr class="memitem:aaab59af46d922d6b81fce8d8be987028"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html">POOL_DESC</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028">GetDesc</a> () const</td></tr>
 <tr class="memdesc:aaab59af46d922d6b81fce8d8be987028"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns copy of parameters of the pool.  <a href="class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028">More...</a><br /></td></tr>
 <tr class="separator:aaab59af46d922d6b81fce8d8be987028"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8e4cc5fb13aa33398d391296336c457e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e">CalculateStats</a> (<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html">StatInfo</a> *pStats)</td></tr>
-<tr class="memdesc:a8e4cc5fb13aa33398d391296336c457e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from the current state of this pool.  <a href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e">More...</a><br /></td></tr>
-<tr class="separator:a8e4cc5fb13aa33398d391296336c457e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9d849dc4667314b2a53eddf02f5af91"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91">GetStatistics</a> (<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> *pStats)</td></tr>
+<tr class="memdesc:aa9d849dc4667314b2a53eddf02f5af91"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves basic statistics of the custom pool that are fast to calculate.  <a href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91">More...</a><br /></td></tr>
+<tr class="separator:aa9d849dc4667314b2a53eddf02f5af91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad07999ac5dc8f0c63187afd45d551910"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910">CalculateStatistics</a> (<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> *pStats)</td></tr>
+<tr class="memdesc:ad07999ac5dc8f0c63187afd45d551910"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves detailed statistics of the custom pool that are slower to calculate.  <a href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910">More...</a><br /></td></tr>
+<tr class="separator:ad07999ac5dc8f0c63187afd45d551910"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a20617cfec0461cf8c2b92115b5140c5b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b">SetName</a> (LPCWSTR Name)</td></tr>
 <tr class="memdesc:a20617cfec0461cf8c2b92115b5140c5b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Associates a name with the pool. This name is for use in debug diagnostics and tools.  <a href="class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b">More...</a><br /></td></tr>
 <tr class="separator:a20617cfec0461cf8c2b92115b5140c5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -104,23 +107,29 @@
 <p >Represents a separate set of heaps (memory blocks) that can be used to create <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a>-s and resources in it. Usually there is no need to create custom pools - creating resources in default pool is sufficient.</p>
 <p >To create custom pool, fill <a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" title="Parameters of created D3D12MA::Pool object. To be used with D3D12MA::Allocator::CreatePool.">D3D12MA::POOL_DESC</a> and call <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a>. </p>
 </div><h2 class="groupheader">Member Function Documentation</h2>
-<a id="a8e4cc5fb13aa33398d391296336c457e" name="a8e4cc5fb13aa33398d391296336c457e"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a8e4cc5fb13aa33398d391296336c457e">&#9670;&nbsp;</a></span>CalculateStats()</h2>
+<a id="ad07999ac5dc8f0c63187afd45d551910" name="ad07999ac5dc8f0c63187afd45d551910"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad07999ac5dc8f0c63187afd45d551910">&#9670;&nbsp;</a></span>CalculateStatistics()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void D3D12MA::Pool::CalculateStats </td>
+          <td class="memname">void D3D12MA::Pool::CalculateStatistics </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html">StatInfo</a> *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> *&#160;</td>
           <td class="paramname"><em>pStats</em></td><td>)</td>
           <td></td>
         </tr>
       </table>
 </div><div class="memdoc">
 
-<p>Retrieves statistics from the current state of this pool. </p>
+<p>Retrieves detailed statistics of the custom pool that are slower to calculate. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[out]</td><td class="paramname">pStats</td><td>Statistics of the current pool. </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
@@ -165,6 +174,32 @@
 
 </div>
 </div>
+<a id="aa9d849dc4667314b2a53eddf02f5af91" name="aa9d849dc4667314b2a53eddf02f5af91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa9d849dc4667314b2a53eddf02f5af91">&#9670;&nbsp;</a></span>GetStatistics()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void D3D12MA::Pool::GetStatistics </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> *&#160;</td>
+          <td class="paramname"><em>pStats</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves basic statistics of the custom pool that are fast to calculate. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[out]</td><td class="paramname">pStats</td><td>Statistics of the current pool. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="a20617cfec0461cf8c2b92115b5140c5b" name="a20617cfec0461cf8c2b92115b5140c5b"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a20617cfec0461cf8c2b92115b5140c5b">&#9670;&nbsp;</a></span>SetName()</h2>
 
diff --git a/docs/html/class_d3_d12_m_a_1_1_virtual_block-members.html b/docs/html/class_d3_d12_m_a_1_1_virtual_block-members.html
index fa864cc..f87e8a2 100644
--- a/docs/html/class_d3_d12_m_a_1_1_virtual_block-members.html
+++ b/docs/html/class_d3_d12_m_a_1_1_virtual_block-members.html
@@ -74,15 +74,16 @@
 <table class="directory">
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179">Allocate</a>(const VIRTUAL_ALLOCATION_DESC *pDesc, VirtualAllocation *pAllocation, UINT64 *pOffset)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703">BuildStatsString</a>(WCHAR **ppStatsString) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">CalculateStats</a>(StatInfo *pInfo) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9">CalculateStatistics</a>(DetailedStatistics *pStats) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ae22b18c0b7c31b44c1d740f886369189">Clear</a>()</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0485028cbe13b5457fe422865f7edf74">CreateVirtualBlock</a></td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a968f13f23d03e50cc50b87835b6d5a85">D3D12MA_DELETE</a></td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"><span class="mlabel">friend</span></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#aab44e46bd122054c894fc84740f1e8fb">FreeAllocation</a>(VirtualAllocation allocation)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
   <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a6f78ddaa7da194e239089e52093e68a9">FreeStatsString</a>(WCHAR *pStatsString) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1">GetAllocationInfo</a>(VirtualAllocation allocation, VIRTUAL_ALLOCATION_INFO *pInfo) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a7b23fd2da6f0343095fb14b31395678b">IsEmpty</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9faeb1ad64ffd04b86a314fe04a8c81d">SetAllocationUserData</a>(VirtualAllocation allocation, void *pUserData)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">GetStatistics</a>(Statistics *pStats) const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a7b23fd2da6f0343095fb14b31395678b">IsEmpty</a>() const</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9faeb1ad64ffd04b86a314fe04a8c81d">SetAllocationUserData</a>(VirtualAllocation allocation, void *pUserData)</td><td class="entry"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</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/class_d3_d12_m_a_1_1_virtual_block.html b/docs/html/class_d3_d12_m_a_1_1_virtual_block.html
index 55be937..f310b0f 100644
--- a/docs/html/class_d3_d12_m_a_1_1_virtual_block.html
+++ b/docs/html/class_d3_d12_m_a_1_1_virtual_block.html
@@ -104,9 +104,12 @@
 <tr class="memitem:a9faeb1ad64ffd04b86a314fe04a8c81d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9faeb1ad64ffd04b86a314fe04a8c81d">SetAllocationUserData</a> (<a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html">VirtualAllocation</a> allocation, void *pUserData)</td></tr>
 <tr class="memdesc:a9faeb1ad64ffd04b86a314fe04a8c81d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes custom pointer for an allocation to a new value.  <a href="class_d3_d12_m_a_1_1_virtual_block.html#a9faeb1ad64ffd04b86a314fe04a8c81d">More...</a><br /></td></tr>
 <tr class="separator:a9faeb1ad64ffd04b86a314fe04a8c81d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a039ee8426818d0126cf7f44c1c658526"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">CalculateStats</a> (<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html">StatInfo</a> *pInfo) const</td></tr>
-<tr class="memdesc:a039ee8426818d0126cf7f44c1c658526"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from the current state of the block.  <a href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">More...</a><br /></td></tr>
-<tr class="separator:a039ee8426818d0126cf7f44c1c658526"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f1dda0e019e218b021f64987a74b110"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">GetStatistics</a> (<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> *pStats) const</td></tr>
+<tr class="memdesc:a0f1dda0e019e218b021f64987a74b110"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves basic statistics of the virtual block that are fast to calculate.  <a href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">More...</a><br /></td></tr>
+<tr class="separator:a0f1dda0e019e218b021f64987a74b110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a614a82247ce6cf29c38895e16eb971d9"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9">CalculateStatistics</a> (<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> *pStats) const</td></tr>
+<tr class="memdesc:a614a82247ce6cf29c38895e16eb971d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves detailed statistics of the virtual block that are slower to calculate.  <a href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9">More...</a><br /></td></tr>
+<tr class="separator:a614a82247ce6cf29c38895e16eb971d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a828a27070bfa762cae796d4c8f2ef703"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703">BuildStatsString</a> (WCHAR **ppStatsString) const</td></tr>
 <tr class="memdesc:a828a27070bfa762cae796d4c8f2ef703"><td class="mdescLeft">&#160;</td><td class="mdescRight">Builds and returns statistics as a string in JSON format, including the list of allocations with their parameters.  <a href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703">More...</a><br /></td></tr>
 <tr class="separator:a828a27070bfa762cae796d4c8f2ef703"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -192,23 +195,29 @@
 
 </div>
 </div>
-<a id="a039ee8426818d0126cf7f44c1c658526" name="a039ee8426818d0126cf7f44c1c658526"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a039ee8426818d0126cf7f44c1c658526">&#9670;&nbsp;</a></span>CalculateStats()</h2>
+<a id="a614a82247ce6cf29c38895e16eb971d9" name="a614a82247ce6cf29c38895e16eb971d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a614a82247ce6cf29c38895e16eb971d9">&#9670;&nbsp;</a></span>CalculateStatistics()</h2>
 
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void D3D12MA::VirtualBlock::CalculateStats </td>
+          <td class="memname">void D3D12MA::VirtualBlock::CalculateStatistics </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html">StatInfo</a> *&#160;</td>
-          <td class="paramname"><em>pInfo</em></td><td>)</td>
+          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> *&#160;</td>
+          <td class="paramname"><em>pStats</em></td><td>)</td>
           <td> const</td>
         </tr>
       </table>
 </div><div class="memdoc">
 
-<p>Retrieves statistics from the current state of the block. </p>
+<p>Retrieves detailed statistics of the virtual block that are slower to calculate. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[out]</td><td class="paramname">pStats</td><td>Statistics of the virtual block. </td></tr>
+  </table>
+  </dd>
+</dl>
 
 </div>
 </div>
@@ -302,6 +311,32 @@
 
 </div>
 </div>
+<a id="a0f1dda0e019e218b021f64987a74b110" name="a0f1dda0e019e218b021f64987a74b110"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f1dda0e019e218b021f64987a74b110">&#9670;&nbsp;</a></span>GetStatistics()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void D3D12MA::VirtualBlock::GetStatistics </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> *&#160;</td>
+          <td class="paramname"><em>pStats</em></td><td>)</td>
+          <td> const</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves basic statistics of the virtual block that are fast to calculate. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[out]</td><td class="paramname">pStats</td><td>Statistics of the virtual block. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
 <a id="a7b23fd2da6f0343095fb14b31395678b" name="a7b23fd2da6f0343095fb14b31395678b"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a7b23fd2da6f0343095fb14b31395678b">&#9670;&nbsp;</a></span>IsEmpty()</h2>
 
diff --git a/docs/html/classes.html b/docs/html/classes.html
index 51450b5..6b35507 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -65,7 +65,7 @@
   <div class="headertitle"><div class="title">Class Index</div></div>
 </div><!--header-->
 <div class="contents">
-<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_V">V</a></div>
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_V">V</a></div>
 <div class="classindex">
 <dl class="classindex even">
 <dt class="alphachar"><a id="letter_A" name="letter_A">A</a></dt>
@@ -74,11 +74,17 @@
 <dt class="alphachar"><a id="letter_B" name="letter_B">B</a></dt>
 <dd><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">Budget</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
 <dl class="classindex even">
+<dt class="alphachar"><a id="letter_D" name="letter_D">D</a></dt>
+<dd><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
+<dl class="classindex odd">
 <dt class="alphachar"><a id="letter_P" name="letter_P">P</a></dt>
 <dd><a class="el" href="class_d3_d12_m_a_1_1_pool.html">Pool</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html">POOL_DESC</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
-<dl class="classindex odd">
+<dl class="classindex even">
 <dt class="alphachar"><a id="letter_S" name="letter_S">S</a></dt>
-<dd><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html">StatInfo</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="struct_d3_d12_m_a_1_1_stats.html">Stats</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
+<dd><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
+<dl class="classindex odd">
+<dt class="alphachar"><a id="letter_T" name="letter_T">T</a></dt>
+<dd><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
 <dl class="classindex even">
 <dt class="alphachar"><a id="letter_V" name="letter_V">V</a></dt>
 <dd><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">VIRTUAL_ALLOCATION_DESC</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html">VIRTUAL_ALLOCATION_INFO</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html">VIRTUAL_BLOCK_DESC</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html">VirtualAllocation</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd><dd><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">VirtualBlock</a> (<a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a>)</dd></dl>
diff --git a/docs/html/configuration.html b/docs/html/configuration.html
index 359c51e..cc819ea 100644
--- a/docs/html/configuration.html
+++ b/docs/html/configuration.html
@@ -101,15 +101,15 @@
 <div class="line"> </div>
 <div class="line"><a class="code hl_class" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a>* allocator;</div>
 <div class="line">HRESULT hr = <a class="code hl_function" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0">D3D12MA::CreateAllocator</a>(&amp;allocatorDesc, &amp;allocator);</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocator_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></div><div class="ttdoc">Represents main object of this library initialized for particular ID3D12Device.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:737</div></div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocator_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></div><div class="ttdoc">Represents main object of this library initialized for particular ID3D12Device.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:793</div></div>
 <div class="ttc" id="anamespace_d3_d12_m_a_html_ab7a1cd1683986d75ce1488b0920f4cb0"><div class="ttname"><a href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0">D3D12MA::CreateAllocator</a></div><div class="ttdeci">D3D12MA_API HRESULT CreateAllocator(const ALLOCATOR_DESC *pDesc, Allocator **ppAllocator)</div><div class="ttdoc">Creates new main D3D12MA::Allocator object and returns it through ppAllocator.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html">D3D12MA::ALLOCATION_CALLBACKS</a></div><div class="ttdoc">Custom callbacks to CPU memory allocation functions.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:182</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html_a114e6c4d63d6b020e01f526a975d6849"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#a114e6c4d63d6b020e01f526a975d6849">D3D12MA::ALLOCATION_CALLBACKS::pFree</a></div><div class="ttdeci">FREE_FUNC_PTR pFree</div><div class="ttdoc">Dellocation function.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:186</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html_af4d6436455728696fefd503869226436"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#af4d6436455728696fefd503869226436">D3D12MA::ALLOCATION_CALLBACKS::pAllocate</a></div><div class="ttdeci">ALLOCATE_FUNC_PTR pAllocate</div><div class="ttdoc">Allocation function.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:184</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></div><div class="ttdoc">Parameters of created Allocator object. To be used with CreateAllocator().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:618</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_a773ecc1945eb47c20e06455c3759e4ef"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#a773ecc1945eb47c20e06455c3759e4ef">D3D12MA::ALLOCATOR_DESC::pAllocationCallbacks</a></div><div class="ttdeci">const ALLOCATION_CALLBACKS * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:638</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_abf9a9f87f0ffea52816efd363c5fcd7b"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#abf9a9f87f0ffea52816efd363c5fcd7b">D3D12MA::ALLOCATOR_DESC::pAdapter</a></div><div class="ttdeci">IDXGIAdapter * pAdapter</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:644</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_ada1bf21205065b3aa0284b5a9ee1cb3c"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#ada1bf21205065b3aa0284b5a9ee1cb3c">D3D12MA::ALLOCATOR_DESC::pDevice</a></div><div class="ttdeci">ID3D12Device * pDevice</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:626</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html">D3D12MA::ALLOCATION_CALLBACKS</a></div><div class="ttdoc">Custom callbacks to CPU memory allocation functions.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:184</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html_a114e6c4d63d6b020e01f526a975d6849"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#a114e6c4d63d6b020e01f526a975d6849">D3D12MA::ALLOCATION_CALLBACKS::pFree</a></div><div class="ttdeci">FREE_FUNC_PTR pFree</div><div class="ttdoc">Dellocation function.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:188</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s_html_af4d6436455728696fefd503869226436"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#af4d6436455728696fefd503869226436">D3D12MA::ALLOCATION_CALLBACKS::pAllocate</a></div><div class="ttdeci">ALLOCATE_FUNC_PTR pAllocate</div><div class="ttdoc">Allocation function.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:186</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></div><div class="ttdoc">Parameters of created Allocator object. To be used with CreateAllocator().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:749</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_a773ecc1945eb47c20e06455c3759e4ef"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#a773ecc1945eb47c20e06455c3759e4ef">D3D12MA::ALLOCATOR_DESC::pAllocationCallbacks</a></div><div class="ttdeci">const ALLOCATION_CALLBACKS * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:769</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_abf9a9f87f0ffea52816efd363c5fcd7b"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#abf9a9f87f0ffea52816efd363c5fcd7b">D3D12MA::ALLOCATOR_DESC::pAdapter</a></div><div class="ttdeci">IDXGIAdapter * pAdapter</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:775</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_ada1bf21205065b3aa0284b5a9ee1cb3c"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#ada1bf21205065b3aa0284b5a9ee1cb3c">D3D12MA::ALLOCATOR_DESC::pDevice</a></div><div class="ttdeci">ID3D12Device * pDevice</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:757</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="debug_margins"></a>
 Debug margins</h1>
 <p >By default, allocations are laid out in memory blocks next to each other if possible (considering required alignment returned by <code>ID3D12Device::GetResourceAllocationInfo</code>).</p>
@@ -119,7 +119,7 @@
 <p >If your bug goes away after enabling margins, it means it may be caused by memory being overwritten outside of allocation boundaries. It is not 100% certain though. Change in application behavior may also be caused by different order and distribution of allocations across memory blocks after margins are applied.</p>
 <p >Margins work with all memory heap types.</p>
 <p >Margin is applied only to placed allocations made out of memory heaps and not to committed allocations, which have their own, implicit memory heap of specific size. It is thus not applied to allocations made using <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675">D3D12MA::ALLOCATION_FLAG_COMMITTED</a> flag or those automatically decided to put into committed allocations, e.g. due to its large size.</p>
-<p >Margins appear in JSON dump as part of free space.</p>
+<p >Margins appear in <a class="el" href="statistics.html#statistics_json_dump">JSON dump</a> as part of free space.</p>
 <p >Note that enabling margins increases memory usage and fragmentation.</p>
 <p >Margins do not apply to <a class="el" href="virtual_allocator.html">Virtual allocator</a>. </p>
 </div></div><!-- contents -->
diff --git a/docs/html/custom_pools.html b/docs/html/custom_pools.html
index 948bb97..f58a1a2 100644
--- a/docs/html/custom_pools.html
+++ b/docs/html/custom_pools.html
@@ -94,7 +94,7 @@
 <p >While it is recommended to use default pools whenever possible for simplicity and to give the allocator more opportunities for internal optimizations, custom pools may be useful in following cases:</p>
 <ul>
 <li>To keep some resources separate from others in memory.</li>
-<li>To keep track of memory usage of just a specific group of resources. Statistics can be queried using <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e" title="Retrieves statistics from the current state of this pool.">D3D12MA::Pool::CalculateStats</a>.</li>
+<li>To keep track of memory usage of just a specific group of resources. Statistics can be queried using D3D12MA::Pool::CalculateStats.</li>
 <li>To use specific size of a memory block (<code>ID3D12Heap</code>). To set it, use member <a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#af7284cc51a8ed5b551075584256de23c" title="Size of a single heap (memory block) to be allocated as part of this pool, in bytes....">D3D12MA::POOL_DESC::BlockSize</a>. When set to 0, the library uses automatically determined, variable block sizes.</li>
 <li>To reserve some minimum amount of memory allocated. To use it, set member <a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8" title="Minimum number of heaps (memory blocks) to be always allocated in this pool, even if they stay empty....">D3D12MA::POOL_DESC::MinBlockCount</a>.</li>
 <li>To limit maximum amount of memory allocated. To use it, set member <a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#abbce3a99f253928f9c3c09fa16015f9e" title="Maximum number of heaps (memory blocks) that can be allocated in this pool. Optional.">D3D12MA::POOL_DESC::MaxBlockCount</a>.</li>
@@ -110,7 +110,7 @@
 <div class="line">ID3D12Resource* res;</div>
 <div class="line">hr = allocator-&gt;CreateResource(&amp;allocDesc, &amp;resDesc,</div>
 <div class="line">    D3D12_RESOURCE_STATE_GENERIC_READ, NULL, &amp;alloc, IID_PPV_ARGS(&amp;res));</div>
-<div class="ttc" id="anamespace_d3_d12_m_a_html_abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675"><div class="ttname"><a href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675">D3D12MA::ALLOCATION_FLAG_COMMITTED</a></div><div class="ttdeci">@ ALLOCATION_FLAG_COMMITTED</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:202</div></div>
+<div class="ttc" id="anamespace_d3_d12_m_a_html_abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675"><div class="ttname"><a href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675">D3D12MA::ALLOCATION_FLAG_COMMITTED</a></div><div class="ttdeci">@ ALLOCATION_FLAG_COMMITTED</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:210</div></div>
 </div><!-- fragment --><p >This feature may seem unnecessary, but creating committed allocations from custom pools may be useful in some cases, e.g. to have separate memory usage statistics for some group of resources or to use extended allocation parameters, like custom <code>D3D12_HEAP_PROPERTIES</code>, which are available only in custom pools. </p>
 </div></div><!-- contents -->
 </div><!-- PageDoc -->
diff --git a/docs/html/functions.html b/docs/html/functions.html
index 3b31f37..f8c3a95 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -68,11 +68,10 @@
 <li>Alignment&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aaa95e62f2f399339a09dcbb312a42de0">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></li>
 <li>Allocate()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179">D3D12MA::VirtualBlock</a></li>
 <li>AllocateMemory()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#acb8a10a5ea30171ce60128286aec5ee2">D3D12MA::Allocator</a></li>
-<li>AllocationBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099">D3D12MA::Budget</a></li>
-<li>AllocationCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeAvg&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#acf3339540ff01d93b6a6f5dc68d83f60">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#acd3c6f72ffb61a8d39b65a3dab317eb6">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a9d9e69e9cad231fea3a41b06e7eeee35">D3D12MA::StatInfo</a></li>
+<li>AllocationBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">D3D12MA::Statistics</a></li>
+<li>AllocationCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">D3D12MA::Statistics</a></li>
+<li>AllocationSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991">D3D12MA::DetailedStatistics</a></li>
+<li>AllocationSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a">D3D12MA::DetailedStatistics</a></li>
 <li>allocHandle&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c">D3D12MA::Allocation</a></li>
 <li>AllocHandle&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13">D3D12MA::VirtualAllocation</a></li>
 </ul>
@@ -80,8 +79,8 @@
 
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
 <li>block&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a413aec64eba9f4ec57e912511591b3b8">D3D12MA::Allocation</a></li>
-<li>BlockBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c">D3D12MA::Budget</a></li>
-<li>BlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a8284ef3310c9de1600071285448b62c9">D3D12MA::StatInfo</a></li>
+<li>BlockBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812">D3D12MA::Statistics</a></li>
+<li>BlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65">D3D12MA::Statistics</a></li>
 <li>BlockSize&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#af7284cc51a8ed5b551075584256de23c">D3D12MA::POOL_DESC</a></li>
 <li>BudgetBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">D3D12MA::Budget</a></li>
 <li>BuildStatsString()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a29716b3084916abed7793bf2ec4b65db">D3D12MA::Allocator</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703">D3D12MA::VirtualBlock</a></li>
@@ -89,7 +88,7 @@
 
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
-<li>CalculateStats()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b">D3D12MA::Allocator</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">D3D12MA::VirtualBlock</a></li>
+<li>CalculateStatistics()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22">D3D12MA::Allocator</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9">D3D12MA::VirtualBlock</a></li>
 <li>Clear()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ae22b18c0b7c31b44c1d740f886369189">D3D12MA::VirtualBlock</a></li>
 <li>CreateAliasingResource()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ab45536f92410aedb7be44ea36b1b4717">D3D12MA::Allocator</a></li>
 <li>CreateAllocator&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a458f044fdc81e4a0b147e99ffcf73459">D3D12MA::Allocator</a></li>
@@ -120,14 +119,16 @@
 
 <h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
 <li>GetAllocationInfo()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1">D3D12MA::VirtualBlock</a></li>
-<li>GetBudget()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601">D3D12MA::Allocator</a></li>
+<li>GetBudget()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144">D3D12MA::Allocator</a></li>
 <li>GetD3D12Options()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ae276d2358a58a36f8c6639f837f29be5">D3D12MA::Allocator</a></li>
 <li>GetDesc()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028">D3D12MA::Pool</a></li>
 <li>GetHeap()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2">D3D12MA::Allocation</a></li>
+<li>GetMemoryCapacity()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc">D3D12MA::Allocator</a></li>
 <li>GetName()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770">D3D12MA::Allocation</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b">D3D12MA::Pool</a></li>
 <li>GetOffset()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60">D3D12MA::Allocation</a></li>
 <li>GetResource()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18">D3D12MA::Allocation</a></li>
 <li>GetSize()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30">D3D12MA::Allocation</a></li>
+<li>GetStatistics()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">D3D12MA::VirtualBlock</a></li>
 </ul>
 
 
@@ -135,7 +136,7 @@
 <li>heap&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a4e7380aabcac5b0a1cd833c5c84459c6">D3D12MA::Allocation</a></li>
 <li>HeapFlags&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a3795956e4fbfe7c3a23546e02e5d28dc">D3D12MA::POOL_DESC</a></li>
 <li>HeapProperties&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a06e06813bcb5206e9f7a8b0564bf1d6a">D3D12MA::POOL_DESC</a></li>
-<li>HeapType&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_stats.html#a6e433945a118a34f7f6565811e62d718">D3D12MA::Stats</a></li>
+<li>HeapType&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5">D3D12MA::TotalStatistics</a></li>
 </ul>
 
 
@@ -156,6 +157,7 @@
 <li>m_Heap&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adc7cf6224b7ca6205d1099a013f40424">D3D12MA::Allocation</a></li>
 <li>m_Placed&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a35fca5f0b1c5eb46d0bb33cdb7ccc198">D3D12MA::Allocation</a></li>
 <li>MaxBlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#abbce3a99f253928f9c3c09fa16015f9e">D3D12MA::POOL_DESC</a></li>
+<li>MemorySegmentGroup&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650">D3D12MA::TotalStatistics</a></li>
 <li>MinAllocationAlignment&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749">D3D12MA::POOL_DESC</a></li>
 <li>MinBlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8">D3D12MA::POOL_DESC</a></li>
 </ul>
@@ -189,22 +191,20 @@
 <li>SetCurrentFrameIndex()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11">D3D12MA::Allocator</a></li>
 <li>SetName()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#af9e643276b577aa7f21937f75d4b82ac">D3D12MA::Allocation</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b">D3D12MA::Pool</a></li>
 <li>Size&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac">D3D12MA::VIRTUAL_ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#ac265159500190e35ebef8e4784c73a09">D3D12MA::VIRTUAL_ALLOCATION_INFO</a>, <a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4">D3D12MA::VIRTUAL_BLOCK_DESC</a></li>
+<li>Stats&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf">D3D12MA::Budget</a>, <a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f">D3D12MA::DetailedStatistics</a></li>
 </ul>
 
 
 <h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
-<li>Total&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stats.html#ada54d9f0385fcdba491adcfd91f29c28">D3D12MA::Stats</a></li>
+<li>Total&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6">D3D12MA::TotalStatistics</a></li>
 </ul>
 
 
 <h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
-<li>UnusedBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a1df359c2e9ad4c7763122d1ccd86b168">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#adfc245a84fb8fba7936b67bd879ffefb">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeAvg&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a249d7969bf3f836c13a0f111d6ed886d">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a1337269f8777b6b5176c72ca410fbe36">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a180be027720ca98ff3a7470e18a79622">D3D12MA::StatInfo</a></li>
+<li>UnusedRangeCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9">D3D12MA::DetailedStatistics</a></li>
+<li>UnusedRangeSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c">D3D12MA::DetailedStatistics</a></li>
+<li>UnusedRangeSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70">D3D12MA::DetailedStatistics</a></li>
 <li>UsageBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">D3D12MA::Budget</a></li>
-<li>UsedBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7">D3D12MA::StatInfo</a></li>
 </ul>
 
 
diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html
index ce3ba67..6a9cbb3 100644
--- a/docs/html/functions_func.html
+++ b/docs/html/functions_func.html
@@ -76,7 +76,7 @@
 
 
 <h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
-<li>CalculateStats()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b">D3D12MA::Allocator</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">D3D12MA::VirtualBlock</a></li>
+<li>CalculateStatistics()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22">D3D12MA::Allocator</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9">D3D12MA::VirtualBlock</a></li>
 <li>Clear()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ae22b18c0b7c31b44c1d740f886369189">D3D12MA::VirtualBlock</a></li>
 <li>CreateAliasingResource()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ab45536f92410aedb7be44ea36b1b4717">D3D12MA::Allocator</a></li>
 <li>CreatePool()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515">D3D12MA::Allocator</a></li>
@@ -93,14 +93,16 @@
 
 <h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
 <li>GetAllocationInfo()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1">D3D12MA::VirtualBlock</a></li>
-<li>GetBudget()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601">D3D12MA::Allocator</a></li>
+<li>GetBudget()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144">D3D12MA::Allocator</a></li>
 <li>GetD3D12Options()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#ae276d2358a58a36f8c6639f837f29be5">D3D12MA::Allocator</a></li>
 <li>GetDesc()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028">D3D12MA::Pool</a></li>
 <li>GetHeap()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2">D3D12MA::Allocation</a></li>
+<li>GetMemoryCapacity()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc">D3D12MA::Allocator</a></li>
 <li>GetName()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770">D3D12MA::Allocation</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b">D3D12MA::Pool</a></li>
 <li>GetOffset()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60">D3D12MA::Allocation</a></li>
 <li>GetResource()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18">D3D12MA::Allocation</a></li>
 <li>GetSize()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30">D3D12MA::Allocation</a></li>
+<li>GetStatistics()&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91">D3D12MA::Pool</a>, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">D3D12MA::VirtualBlock</a></li>
 </ul>
 
 
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html
index d57916f..6ecd6c2 100644
--- a/docs/html/functions_vars.html
+++ b/docs/html/functions_vars.html
@@ -66,11 +66,10 @@
 
 <h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
 <li>Alignment&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aaa95e62f2f399339a09dcbb312a42de0">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></li>
-<li>AllocationBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099">D3D12MA::Budget</a></li>
-<li>AllocationCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeAvg&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#acf3339540ff01d93b6a6f5dc68d83f60">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#acd3c6f72ffb61a8d39b65a3dab317eb6">D3D12MA::StatInfo</a></li>
-<li>AllocationSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a9d9e69e9cad231fea3a41b06e7eeee35">D3D12MA::StatInfo</a></li>
+<li>AllocationBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">D3D12MA::Statistics</a></li>
+<li>AllocationCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">D3D12MA::Statistics</a></li>
+<li>AllocationSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991">D3D12MA::DetailedStatistics</a></li>
+<li>AllocationSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a">D3D12MA::DetailedStatistics</a></li>
 <li>allocHandle&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c">D3D12MA::Allocation</a></li>
 <li>AllocHandle&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13">D3D12MA::VirtualAllocation</a></li>
 </ul>
@@ -78,8 +77,8 @@
 
 <h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
 <li>block&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a413aec64eba9f4ec57e912511591b3b8">D3D12MA::Allocation</a></li>
-<li>BlockBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c">D3D12MA::Budget</a></li>
-<li>BlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a8284ef3310c9de1600071285448b62c9">D3D12MA::StatInfo</a></li>
+<li>BlockBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812">D3D12MA::Statistics</a></li>
+<li>BlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65">D3D12MA::Statistics</a></li>
 <li>BlockSize&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#af7284cc51a8ed5b551075584256de23c">D3D12MA::POOL_DESC</a></li>
 <li>BudgetBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">D3D12MA::Budget</a></li>
 </ul>
@@ -104,7 +103,7 @@
 <li>heap&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a4e7380aabcac5b0a1cd833c5c84459c6">D3D12MA::Allocation</a></li>
 <li>HeapFlags&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a3795956e4fbfe7c3a23546e02e5d28dc">D3D12MA::POOL_DESC</a></li>
 <li>HeapProperties&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a06e06813bcb5206e9f7a8b0564bf1d6a">D3D12MA::POOL_DESC</a></li>
-<li>HeapType&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_stats.html#a6e433945a118a34f7f6565811e62d718">D3D12MA::Stats</a></li>
+<li>HeapType&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5">D3D12MA::TotalStatistics</a></li>
 </ul>
 
 
@@ -118,6 +117,7 @@
 <li>m_Heap&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adc7cf6224b7ca6205d1099a013f40424">D3D12MA::Allocation</a></li>
 <li>m_Placed&#160;:&#160;<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#a35fca5f0b1c5eb46d0bb33cdb7ccc198">D3D12MA::Allocation</a></li>
 <li>MaxBlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#abbce3a99f253928f9c3c09fa16015f9e">D3D12MA::POOL_DESC</a></li>
+<li>MemorySegmentGroup&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650">D3D12MA::TotalStatistics</a></li>
 <li>MinAllocationAlignment&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749">D3D12MA::POOL_DESC</a></li>
 <li>MinBlockCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8">D3D12MA::POOL_DESC</a></li>
 </ul>
@@ -148,22 +148,20 @@
 
 <h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
 <li>Size&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac">D3D12MA::VIRTUAL_ALLOCATION_DESC</a>, <a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#ac265159500190e35ebef8e4784c73a09">D3D12MA::VIRTUAL_ALLOCATION_INFO</a>, <a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4">D3D12MA::VIRTUAL_BLOCK_DESC</a></li>
+<li>Stats&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf">D3D12MA::Budget</a>, <a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f">D3D12MA::DetailedStatistics</a></li>
 </ul>
 
 
 <h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
-<li>Total&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stats.html#ada54d9f0385fcdba491adcfd91f29c28">D3D12MA::Stats</a></li>
+<li>Total&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6">D3D12MA::TotalStatistics</a></li>
 </ul>
 
 
 <h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
-<li>UnusedBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a1df359c2e9ad4c7763122d1ccd86b168">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#adfc245a84fb8fba7936b67bd879ffefb">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeAvg&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a249d7969bf3f836c13a0f111d6ed886d">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a1337269f8777b6b5176c72ca410fbe36">D3D12MA::StatInfo</a></li>
-<li>UnusedRangeSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#a180be027720ca98ff3a7470e18a79622">D3D12MA::StatInfo</a></li>
+<li>UnusedRangeCount&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9">D3D12MA::DetailedStatistics</a></li>
+<li>UnusedRangeSizeMax&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c">D3D12MA::DetailedStatistics</a></li>
+<li>UnusedRangeSizeMin&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70">D3D12MA::DetailedStatistics</a></li>
 <li>UsageBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">D3D12MA::Budget</a></li>
-<li>UsedBytes&#160;:&#160;<a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7">D3D12MA::StatInfo</a></li>
 </ul>
 </div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html
index 2880acf..ad30082 100644
--- a/docs/html/hierarchy.html
+++ b/docs/html/hierarchy.html
@@ -70,19 +70,20 @@
 <tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html" target="_self">D3D12MA::ALLOCATION_CALLBACKS</a></td><td class="desc">Custom callbacks to CPU memory allocation functions </td></tr>
 <tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">D3D12MA::ALLOCATION_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a> </td></tr>
 <tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html" target="_self">D3D12MA::ALLOCATOR_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a> </td></tr>
-<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">D3D12MA::Budget</a></td><td class="desc">Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory </td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_4_" class="arrow" onclick="toggleFolder('4_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><b>IUnknownImpl</b></td><td class="desc"></td></tr>
-<tr id="row_4_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocation.html" target="_self">D3D12MA::Allocation</a></td><td class="desc">Represents single memory allocation </td></tr>
-<tr id="row_4_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocator.html" target="_self">D3D12MA::Allocator</a></td><td class="desc">Represents main object of this library initialized for particular <code>ID3D12Device</code> </td></tr>
-<tr id="row_4_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">D3D12MA::Pool</a></td><td class="desc">Custom memory pool </td></tr>
-<tr id="row_4_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">D3D12MA::VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
-<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">D3D12MA::POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html" target="_self">D3D12MA::StatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
-<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stats.html" target="_self">D3D12MA::Stats</a></td><td class="desc">General statistics from the current state of the allocator </td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
-<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">D3D12MA::VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</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_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">D3D12MA::VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</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_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">D3D12MA::VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">D3D12MA::Budget</a></td><td class="desc">Statistics of current memory usage and available budget for a specific memory segment group </td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html" target="_self">D3D12MA::DetailedStatistics</a></td><td class="desc">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a> </td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_5_" class="arrow" onclick="toggleFolder('5_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><b>IUnknownImpl</b></td><td class="desc"></td></tr>
+<tr id="row_5_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocation.html" target="_self">D3D12MA::Allocation</a></td><td class="desc">Represents single memory allocation </td></tr>
+<tr id="row_5_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocator.html" target="_self">D3D12MA::Allocator</a></td><td class="desc">Represents main object of this library initialized for particular <code>ID3D12Device</code> </td></tr>
+<tr id="row_5_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">D3D12MA::Pool</a></td><td class="desc">Custom memory pool </td></tr>
+<tr id="row_5_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">D3D12MA::VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">D3D12MA::POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" target="_self">D3D12MA::Statistics</a></td><td class="desc">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total </td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html" target="_self">D3D12MA::TotalStatistics</a></td><td class="desc">General statistics from current state of the allocator - total memory usage across all memory heaps and segments </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_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</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_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">D3D12MA::VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</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_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">D3D12MA::VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</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_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">D3D12MA::VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/index.html b/docs/html/index.html
index 05b936c..70c2efa 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -72,7 +72,6 @@
 <h1><a class="anchor" id="main_table_of_contents"></a>
 Table of contents</h1>
 <ul>
-<li><b>User guide</b><ul>
 <li><a class="el" href="quick_start.html">Quick start</a><ul>
 <li><a class="el" href="quick_start.html#quick_start_project_setup">Project setup</a></li>
 <li><a class="el" href="quick_start.html#quick_start_creating_resources">Creating resources</a></li>
@@ -80,11 +79,10 @@
 </ul>
 </li>
 <li><a class="el" href="custom_pools.html">Custom memory pools</a></li>
+<li><a class="el" href="statistics.html">Statistics</a></li>
 <li><a class="el" href="resource_aliasing.html">Resource aliasing (overlap)</a></li>
 <li><a class="el" href="linear_algorithm.html">Linear allocation algorithm</a></li>
 <li><a class="el" href="virtual_allocator.html">Virtual allocator</a></li>
-</ul>
-</li>
 <li><a class="el" href="configuration.html">Configuration</a><ul>
 <li><a class="el" href="configuration.html#custom_memory_allocator">Custom CPU memory allocator</a></li>
 <li><a class="el" href="configuration.html#debug_margins">Debug margins</a></li>
diff --git a/docs/html/namespace_d3_d12_m_a.html b/docs/html/namespace_d3_d12_m_a.html
index 4471b4a..95d3efd 100644
--- a/docs/html/namespace_d3_d12_m_a.html
+++ b/docs/html/namespace_d3_d12_m_a.html
@@ -90,7 +90,10 @@
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a>.  <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.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_d3_d12_m_a_1_1_budget.html">Budget</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory.  <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a><br /></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics of current memory usage and available budget for a specific memory segment group.  <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a>.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.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">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">Pool</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom memory pool.  <a href="class_d3_d12_m_a_1_1_pool.html#details">More...</a><br /></td></tr>
@@ -98,11 +101,11 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html">POOL_DESC</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a>.  <a href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.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_d3_d12_m_a_1_1_stat_info.html">StatInfo</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage in entire allocator.  <a href="struct_d3_d12_m_a_1_1_stat_info.html#details">More...</a><br /></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_d3_d12_m_a_1_1_statistics.html">Statistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total.  <a href="struct_d3_d12_m_a_1_1_statistics.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_d3_d12_m_a_1_1_stats.html">Stats</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from the current state of the allocator.  <a href="struct_d3_d12_m_a_1_1_stats.html#details">More...</a><br /></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_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">General statistics from current state of the allocator - total memory usage across all memory heaps and segments.  <a href="struct_d3_d12_m_a_1_1_total_statistics.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_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">VIRTUAL_ALLOCATION_DESC</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a>.  <a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#details">More...</a><br /></td></tr>
@@ -146,9 +149,8 @@
 <tr class="memdesc:abbad31a7e0b3d09d77f3fb704b77645e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with ALLOCATION_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645e">More...</a><br /></td></tr>
 <tr class="separator:abbad31a7e0b3d09d77f3fb704b77645e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a919d8545365d6b7209a964f2b99936d1"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">POOL_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02">POOL_FLAG_NONE</a> = 0
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a">POOL_FLAG_ALGORITHM_TLSF</a> = 0x1
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">POOL_FLAG_ALGORITHM_LINEAR</a> = 0x2
-, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">POOL_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_TLSF | POOL_FLAG_ALGORITHM_LINEAR
+, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">POOL_FLAG_ALGORITHM_LINEAR</a> = 0x1
+, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">POOL_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_LINEAR
  }</td></tr>
 <tr class="memdesc:a919d8545365d6b7209a964f2b99936d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with POOL_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">More...</a><br /></td></tr>
 <tr class="separator:a919d8545365d6b7209a964f2b99936d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -159,7 +161,6 @@
 <tr class="memdesc:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bit flags to be used with ALLOCATOR_DESC::Flags.  <a href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916">More...</a><br /></td></tr>
 <tr class="separator:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a578329923a103be086ac52e3bed2085d"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d">VIRTUAL_BLOCK_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d">VIRTUAL_BLOCK_FLAG_NONE</a> = 0
-, <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf">VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF</a> = POOL_FLAG_ALGORITHM_TLSF
 , <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d">VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR</a> = POOL_FLAG_ALGORITHM_LINEAR
 , <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e">VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_MASK
  }</td></tr>
@@ -254,13 +255,18 @@
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645ea0bf578b096d6ea73cea86b031541733e" name="abbad31a7e0b3d09d77f3fb704b77645ea0bf578b096d6ea73cea86b031541733e"></a>ALLOCATION_FLAG_NONE&#160;</td><td class="fielddoc"><p >Zero. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675" name="abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675"></a>ALLOCATION_FLAG_COMMITTED&#160;</td><td class="fielddoc"><p >Set this flag if the allocation should have its own dedicated memory allocation (committed resource with implicit heap).</p>
-<p >Use it for special, big resources, like fullscreen textures used as render targets. </p>
+<p >Use it for special, big resources, like fullscreen textures used as render targets.</p>
+<ul>
+<li>When used with functions like <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">D3D12MA::Allocator::CreateResource</a>, it will use <code>ID3D12Device::CreateCommittedResource</code>, so the created allocation will contain a resource (<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18" title="Returns D3D12 resource associated with this object.">D3D12MA::Allocation::GetResource()</a> <code>!= NULL</code>) but will not have a heap (<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2" title="Returns memory heap that the resource is created in.">D3D12MA::Allocation::GetHeap()</a> <code>== NULL</code>), as the heap is implicit.</li>
+<li>When used with raw memory allocation like <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#acb8a10a5ea30171ce60128286aec5ee2" title="Allocates memory without creating any resource placed in it.">D3D12MA::Allocator::AllocateMemory</a>, it will use <code>ID3D12Device::CreateHeap</code>, so the created allocation will contain a heap (<a class="el" href="class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2" title="Returns memory heap that the resource is created in.">D3D12MA::Allocation::GetHeap()</a> <code>!= NULL</code>) and its offset will always be 0. </li>
+</ul>
 </td></tr>
 <tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645ea9a52c6ae694eadcd20896091e77c0628" name="abbad31a7e0b3d09d77f3fb704b77645ea9a52c6ae694eadcd20896091e77c0628"></a>ALLOCATION_FLAG_NEVER_ALLOCATE&#160;</td><td class="fielddoc"><p >Set this flag to only try to allocate from existing memory heaps and never create new such heap.</p>
 <p >If new allocation cannot be placed in any of the existing heaps, allocation fails with <code>E_OUTOFMEMORY</code> error.</p>
 <p >You should not use <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675">D3D12MA::ALLOCATION_FLAG_COMMITTED</a> and <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea9a52c6ae694eadcd20896091e77c0628">D3D12MA::ALLOCATION_FLAG_NEVER_ALLOCATE</a> at the same time. It makes no sense. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6" name="abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6"></a>ALLOCATION_FLAG_WITHIN_BUDGET&#160;</td><td class="fielddoc"><p >Create allocation only if additional memory required for it, if any, won't exceed memory budget. Otherwise return <code>E_OUTOFMEMORY</code>. </p>
+<tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6" name="abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6"></a>ALLOCATION_FLAG_WITHIN_BUDGET&#160;</td><td class="fielddoc"><p >Create allocation only if additional memory required for it, if any, won't exceed memory budget. Otherwise return <code>E_OUTOFMEMORY</code>.</p>
+<dl class="section warning"><dt>Warning</dt><dd>Currently this feature is not fully implemented yet. </dd></dl>
 </td></tr>
 <tr><td class="fieldname"><a id="abbad31a7e0b3d09d77f3fb704b77645eafb0e2dacce691336e717550a1df72474" name="abbad31a7e0b3d09d77f3fb704b77645eafb0e2dacce691336e717550a1df72474"></a>ALLOCATION_FLAG_UPPER_ADDRESS&#160;</td><td class="fielddoc"><p ><a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">Allocation</a> will be created from upper stack in a double stack pool.</p>
 <p >This flag is only allowed for custom pools created with <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a" title="Enables alternative, linear allocation algorithm in this pool.">POOL_FLAG_ALGORITHM_LINEAR</a> flag. </p>
@@ -310,9 +316,6 @@
 <table class="fieldtable">
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02" name="a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02"></a>POOL_FLAG_NONE&#160;</td><td class="fielddoc"><p >Zero. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a" name="a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a"></a>POOL_FLAG_ALGORITHM_TLSF&#160;</td><td class="fielddoc"><p >Enables alternative, TLSF allocation algorithm in virtual block. </p>
-<p >This algorithm is based on 2-level lists dividing address space into smaller chunks. The first level is aligned to power of two which serves as buckets for requested memory to fall into, and the second level is lineary subdivided into lists of free memory. This algorithm aims to achieve bounded response time even in the worst case scenario. <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">Allocation</a> time can be sometimes slightly longer than compared to other algorithms but in return the application can avoid stalls in case of fragmentation, giving predictable results, suitable for real-time use cases. </p>
-</td></tr>
 <tr><td class="fieldname"><a id="a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a" name="a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a"></a>POOL_FLAG_ALGORITHM_LINEAR&#160;</td><td class="fielddoc"><p >Enables alternative, linear allocation algorithm in this pool. </p>
 <p >Specify this flag to enable linear allocation algorithm, which always creates new allocations after last one and doesn't reuse space from allocations freed in between. It trades memory consumption for simplified algorithm and data structure, which has better performance and uses less memory for metadata.</p>
 <p >By using this flag, you can achieve behavior of free-at-once, stack, ring buffer, and double stack. For details, see documentation chapter <a class="el" href="linear_algorithm.html">Linear allocation algorithm</a>. </p>
@@ -361,9 +364,6 @@
 <table class="fieldtable">
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d" name="a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d"></a>VIRTUAL_BLOCK_FLAG_NONE&#160;</td><td class="fielddoc"><p >Zero. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf" name="a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf"></a>VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF&#160;</td><td class="fielddoc"><p >Enables alternative, TLSF allocation algorithm in virtual block. </p>
-<p >This algorithm is based on 2-level lists dividing address space into smaller chunks. The first level is aligned to power of two which serves as buckets for requested memory to fall into, and the second level is lineary subdivided into lists of free memory. This algorithm aims to achieve bounded response time even in the worst case scenario. <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">Allocation</a> time can be sometimes slightly longer than compared to other algorithms but in return the application can avoid stalls in case of fragmentation, giving predictable results, suitable for real-time use cases. </p>
-</td></tr>
 <tr><td class="fieldname"><a id="a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d" name="a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d"></a>VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR&#160;</td><td class="fielddoc"><p >Enables alternative, linear allocation algorithm in this virtual block. </p>
 <p >Specify this flag to enable linear allocation algorithm, which always creates new allocations after last one and doesn't reuse space from allocations freed in between. It trades memory consumption for simplified algorithm and data structure, which has better performance and uses less memory for metadata.</p>
 <p >By using this flag, you can achieve behavior of free-at-once, stack, ring buffer, and double stack. For details, see documentation chapter <a class="el" href="linear_algorithm.html">Linear allocation algorithm</a>. </p>
diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html
index 7fbaf80..506666d 100644
--- a/docs/html/namespacemembers.html
+++ b/docs/html/namespacemembers.html
@@ -81,7 +81,6 @@
 <li>HEAP_TYPE_COUNT&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#abad7f40135648f8d0871be36f2919982">D3D12MA</a></li>
 <li>POOL_FLAG_ALGORITHM_LINEAR&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">D3D12MA</a></li>
 <li>POOL_FLAG_ALGORITHM_MASK&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">D3D12MA</a></li>
-<li>POOL_FLAG_ALGORITHM_TLSF&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a">D3D12MA</a></li>
 <li>POOL_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02">D3D12MA</a></li>
 <li>POOL_FLAGS&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">D3D12MA</a></li>
 <li>VIRTUAL_ALLOCATION_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a03576295004dec9dc8f99a895d232027">D3D12MA</a></li>
@@ -89,7 +88,6 @@
 <li>VIRTUAL_ALLOCATION_FLAGS&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e">D3D12MA</a></li>
-<li>VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAGS&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d">D3D12MA</a></li>
 </ul>
diff --git a/docs/html/namespacemembers_eval.html b/docs/html/namespacemembers_eval.html
index c45805e..5cd1521 100644
--- a/docs/html/namespacemembers_eval.html
+++ b/docs/html/namespacemembers_eval.html
@@ -73,13 +73,11 @@
 <li>ALLOCATOR_FLAG_SINGLETHREADED&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a1b06bb21df006f76a9ed1bc41838bc52">D3D12MA</a></li>
 <li>POOL_FLAG_ALGORITHM_LINEAR&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">D3D12MA</a></li>
 <li>POOL_FLAG_ALGORITHM_MASK&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">D3D12MA</a></li>
-<li>POOL_FLAG_ALGORITHM_TLSF&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a">D3D12MA</a></li>
 <li>POOL_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02">D3D12MA</a></li>
 <li>VIRTUAL_ALLOCATION_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a03576295004dec9dc8f99a895d232027">D3D12MA</a></li>
 <li>VIRTUAL_ALLOCATION_FLAG_UPPER_ADDRESS&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a86beebcb80a1a10cb5525e2c9ed1435e">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e">D3D12MA</a></li>
-<li>VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf">D3D12MA</a></li>
 <li>VIRTUAL_BLOCK_FLAG_NONE&#160;:&#160;<a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d">D3D12MA</a></li>
 </ul>
 </div><!-- contents -->
diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html
index f85de70..5d63901 100644
--- a/docs/html/namespaces.html
+++ b/docs/html/namespaces.html
@@ -73,16 +73,17 @@
 <tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">ALLOCATION_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a> </td></tr>
 <tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocator.html" target="_self">Allocator</a></td><td class="desc">Represents main object of this library initialized for particular <code>ID3D12Device</code> </td></tr>
 <tr id="row_0_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html" target="_self">ALLOCATOR_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a> </td></tr>
-<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">Budget</a></td><td class="desc">Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory </td></tr>
-<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">Pool</a></td><td class="desc">Custom memory pool </td></tr>
-<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
-<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html" target="_self">StatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
-<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_stats.html" target="_self">Stats</a></td><td class="desc">General statistics from the current state of the allocator </td></tr>
-<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
-<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a> </td></tr>
-<tr id="row_0_12_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a> </td></tr>
-<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
-<tr id="row_0_14_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">Budget</a></td><td class="desc">Statistics of current memory usage and available budget for a specific memory segment group </td></tr>
+<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html" target="_self">DetailedStatistics</a></td><td class="desc">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a> </td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">Pool</a></td><td class="desc">Custom memory pool </td></tr>
+<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
+<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" target="_self">Statistics</a></td><td class="desc">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total </td></tr>
+<tr id="row_0_10_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html" target="_self">TotalStatistics</a></td><td class="desc">General statistics from current state of the allocator - total memory usage across all memory heaps and segments </td></tr>
+<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
+<tr id="row_0_12_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a> </td></tr>
+<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a> </td></tr>
+<tr id="row_0_14_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
+<tr id="row_0_15_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/quick_start.html b/docs/html/quick_start.html
index 8001b37..6546b26 100644
--- a/docs/html/quick_start.html
+++ b/docs/html/quick_start.html
@@ -90,11 +90,11 @@
 <div class="line"> </div>
 <div class="line"><a class="code hl_class" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a>* allocator;</div>
 <div class="line">HRESULT hr = <a class="code hl_function" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0">D3D12MA::CreateAllocator</a>(&amp;allocatorDesc, &amp;allocator);</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocator_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></div><div class="ttdoc">Represents main object of this library initialized for particular ID3D12Device.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:737</div></div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocator_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></div><div class="ttdoc">Represents main object of this library initialized for particular ID3D12Device.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:793</div></div>
 <div class="ttc" id="anamespace_d3_d12_m_a_html_ab7a1cd1683986d75ce1488b0920f4cb0"><div class="ttname"><a href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0">D3D12MA::CreateAllocator</a></div><div class="ttdeci">D3D12MA_API HRESULT CreateAllocator(const ALLOCATOR_DESC *pDesc, Allocator **ppAllocator)</div><div class="ttdoc">Creates new main D3D12MA::Allocator object and returns it through ppAllocator.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></div><div class="ttdoc">Parameters of created Allocator object. To be used with CreateAllocator().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:618</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_abf9a9f87f0ffea52816efd363c5fcd7b"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#abf9a9f87f0ffea52816efd363c5fcd7b">D3D12MA::ALLOCATOR_DESC::pAdapter</a></div><div class="ttdeci">IDXGIAdapter * pAdapter</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:644</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_ada1bf21205065b3aa0284b5a9ee1cb3c"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#ada1bf21205065b3aa0284b5a9ee1cb3c">D3D12MA::ALLOCATOR_DESC::pDevice</a></div><div class="ttdeci">ID3D12Device * pDevice</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:626</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></div><div class="ttdoc">Parameters of created Allocator object. To be used with CreateAllocator().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:749</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_abf9a9f87f0ffea52816efd363c5fcd7b"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#abf9a9f87f0ffea52816efd363c5fcd7b">D3D12MA::ALLOCATOR_DESC::pAdapter</a></div><div class="ttdeci">IDXGIAdapter * pAdapter</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:775</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c_html_ada1bf21205065b3aa0284b5a9ee1cb3c"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#ada1bf21205065b3aa0284b5a9ee1cb3c">D3D12MA::ALLOCATOR_DESC::pDevice</a></div><div class="ttdeci">ID3D12Device * pDevice</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:757</div></div>
 </div><!-- fragment --><p >(5.) Right before destroying the D3D12 device, destroy the allocator object.</p>
 <p >Objects of this library must be destroyed by calling <code>Release</code> method. They are somewhat compatible with COM: they implement <code>IUnknown</code> interface with its virtual methods: <code>AddRef</code>, <code>Release</code>, <code>QueryInterface</code>, and they are reference-counted internally. You can use smart pointers designed for COM with objects of this library - e.g. <code>CComPtr</code> or <code>Microsoft::WRL::ComPtr</code>. The reference counter is thread-safe. <code>QueryInterface</code> method supports only <code>IUnknown</code>, as classes of this library don't define their own GUIDs.</p>
 <div class="fragment"><div class="line">allocator-&gt;Release();</div>
@@ -128,10 +128,10 @@
 <div class="line">    NULL,</div>
 <div class="line">    &amp;allocation,</div>
 <div class="line">    IID_PPV_ARGS(&amp;resource));</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocation_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocation.html">D3D12MA::Allocation</a></div><div class="ttdoc">Represents single memory allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:285</div></div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocation_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocation.html">D3D12MA::Allocation</a></div><div class="ttdoc">Represents single memory allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:420</div></div>
 <div class="ttc" id="aclass_d3_d12_m_a_1_1_allocator_html_aa37d6b9fe8ea0864f7a35b9d68e8345a"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a">D3D12MA::Allocator::CreateResource</a></div><div class="ttdeci">HRESULT CreateResource(const ALLOCATION_DESC *pAllocDesc, const D3D12_RESOURCE_DESC *pResourceDesc, D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue, Allocation **ppAllocation, REFIID riidResource, void **ppvResource)</div><div class="ttdoc">Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::Allocation object. To be used with Allocator::CreateResource.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:229</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aa46b3c0456e5a23edef3328607ebf4d7"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC::HeapType</a></div><div class="ttdeci">D3D12_HEAP_TYPE HeapType</div><div class="ttdoc">The type of memory heap where the new allocation should be placed.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:238</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::Allocation object. To be used with Allocator::CreateResource.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:239</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aa46b3c0456e5a23edef3328607ebf4d7"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC::HeapType</a></div><div class="ttdeci">D3D12_HEAP_TYPE HeapType</div><div class="ttdoc">The type of memory heap where the new allocation should be placed.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:248</div></div>
 </div><!-- fragment --><p >You need to remember both resource and allocation objects and destroy them separately when no longer needed.</p>
 <div class="fragment"><div class="line">allocation-&gt;Release();</div>
 <div class="line">resource-&gt;Release();</div>
diff --git a/docs/html/resource_aliasing.html b/docs/html/resource_aliasing.html
index c9280b5..7325d5b 100644
--- a/docs/html/resource_aliasing.html
+++ b/docs/html/resource_aliasing.html
@@ -144,11 +144,11 @@
 <div class="line">res2-&gt;Release();</div>
 <div class="line">res1-&gt;Release();</div>
 <div class="line">alloc-&gt;Release();</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocation_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocation.html">D3D12MA::Allocation</a></div><div class="ttdoc">Represents single memory allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:285</div></div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_allocation_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocation.html">D3D12MA::Allocation</a></div><div class="ttdoc">Represents single memory allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:420</div></div>
 <div class="ttc" id="aclass_d3_d12_m_a_1_1_allocation_html_adca8d5a82bed492fe7265fcda6e53da2"><div class="ttname"><a href="class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2">D3D12MA::Allocation::GetHeap</a></div><div class="ttdeci">ID3D12Heap * GetHeap() const</div><div class="ttdoc">Returns memory heap that the resource is created in.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::Allocation object. To be used with Allocator::CreateResource.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:229</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_a97878838f976b2d1e6b1a76881035690"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a97878838f976b2d1e6b1a76881035690">D3D12MA::ALLOCATION_DESC::ExtraHeapFlags</a></div><div class="ttdeci">D3D12_HEAP_FLAGS ExtraHeapFlags</div><div class="ttdoc">Additional heap flags to be used when allocating memory.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:254</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aa46b3c0456e5a23edef3328607ebf4d7"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC::HeapType</a></div><div class="ttdeci">D3D12_HEAP_TYPE HeapType</div><div class="ttdoc">The type of memory heap where the new allocation should be placed.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:238</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::Allocation object. To be used with Allocator::CreateResource.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:239</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_a97878838f976b2d1e6b1a76881035690"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a97878838f976b2d1e6b1a76881035690">D3D12MA::ALLOCATION_DESC::ExtraHeapFlags</a></div><div class="ttdeci">D3D12_HEAP_FLAGS ExtraHeapFlags</div><div class="ttdoc">Additional heap flags to be used when allocating memory.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:264</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aa46b3c0456e5a23edef3328607ebf4d7"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7">D3D12MA::ALLOCATION_DESC::HeapType</a></div><div class="ttdeci">D3D12_HEAP_TYPE HeapType</div><div class="ttdoc">The type of memory heap where the new allocation should be placed.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:248</div></div>
 </div><!-- fragment --><p >Remember that using resouces that alias in memory requires proper synchronization. You need to issue a special barrier of type <code>D3D12_RESOURCE_BARRIER_TYPE_ALIASING</code>. You also need to treat a resource after aliasing as uninitialized - containing garbage data. For example, if you use <code>res1</code> and then want to use <code>res2</code>, you need to first initialize <code>res2</code> using either Clear, Discard, or Copy to the entire resource.</p>
 <p >Additional considerations:</p>
 <ul>
diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js
index b3b9d2a..b0cba40 100644
--- a/docs/html/search/all_0.js
+++ b/docs/html/search/all_0.js
@@ -13,18 +13,16 @@
   ['allocation_5fflag_5fupper_5faddress_10',['ALLOCATION_FLAG_UPPER_ADDRESS',['../namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eafb0e2dacce691336e717550a1df72474',1,'D3D12MA']]],
   ['allocation_5fflag_5fwithin_5fbudget_11',['ALLOCATION_FLAG_WITHIN_BUDGET',['../namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6',1,'D3D12MA']]],
   ['allocation_5fflags_12',['ALLOCATION_FLAGS',['../namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645e',1,'D3D12MA']]],
-  ['allocationbytes_13',['AllocationBytes',['../struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099',1,'D3D12MA::Budget']]],
-  ['allocationcount_14',['AllocationCount',['../struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e',1,'D3D12MA::StatInfo']]],
-  ['allocationsizeavg_15',['AllocationSizeAvg',['../struct_d3_d12_m_a_1_1_stat_info.html#acf3339540ff01d93b6a6f5dc68d83f60',1,'D3D12MA::StatInfo']]],
-  ['allocationsizemax_16',['AllocationSizeMax',['../struct_d3_d12_m_a_1_1_stat_info.html#acd3c6f72ffb61a8d39b65a3dab317eb6',1,'D3D12MA::StatInfo']]],
-  ['allocationsizemin_17',['AllocationSizeMin',['../struct_d3_d12_m_a_1_1_stat_info.html#a9d9e69e9cad231fea3a41b06e7eeee35',1,'D3D12MA::StatInfo']]],
-  ['allocator_18',['Allocator',['../class_d3_d12_m_a_1_1_allocator.html',1,'D3D12MA']]],
-  ['allocator_5fdesc_19',['ALLOCATOR_DESC',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html',1,'D3D12MA']]],
-  ['allocator_5fflag_5falways_5fcommitted_20',['ALLOCATOR_FLAG_ALWAYS_COMMITTED',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a068863dc0538ff4ea153b046b31e94fb',1,'D3D12MA']]],
-  ['allocator_5fflag_5fnone_21',['ALLOCATOR_FLAG_NONE',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a2fb30967b492c27823a80b5de3aea26f',1,'D3D12MA']]],
-  ['allocator_5fflag_5fsinglethreaded_22',['ALLOCATOR_FLAG_SINGLETHREADED',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a1b06bb21df006f76a9ed1bc41838bc52',1,'D3D12MA']]],
-  ['allocator_5fflags_23',['ALLOCATOR_FLAGS',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916',1,'D3D12MA']]],
-  ['allochandle_24',['AllocHandle',['../struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13',1,'D3D12MA::VirtualAllocation']]],
-  ['allochandle_25',['allocHandle',['../class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c',1,'D3D12MA::Allocation']]],
-  ['allochandle_26',['AllocHandle',['../namespace_d3_d12_m_a.html#a15e349adce86a40e0417d405aef1af80',1,'D3D12MA']]]
+  ['allocationbytes_13',['AllocationBytes',['../struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8',1,'D3D12MA::Statistics']]],
+  ['allocationcount_14',['AllocationCount',['../struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68',1,'D3D12MA::Statistics']]],
+  ['allocationsizemax_15',['AllocationSizeMax',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991',1,'D3D12MA::DetailedStatistics']]],
+  ['allocationsizemin_16',['AllocationSizeMin',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a',1,'D3D12MA::DetailedStatistics']]],
+  ['allocator_17',['Allocator',['../class_d3_d12_m_a_1_1_allocator.html',1,'D3D12MA']]],
+  ['allocator_5fdesc_18',['ALLOCATOR_DESC',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html',1,'D3D12MA']]],
+  ['allocator_5fflag_5falways_5fcommitted_19',['ALLOCATOR_FLAG_ALWAYS_COMMITTED',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a068863dc0538ff4ea153b046b31e94fb',1,'D3D12MA']]],
+  ['allocator_5fflag_5fnone_20',['ALLOCATOR_FLAG_NONE',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a2fb30967b492c27823a80b5de3aea26f',1,'D3D12MA']]],
+  ['allocator_5fflag_5fsinglethreaded_21',['ALLOCATOR_FLAG_SINGLETHREADED',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a1b06bb21df006f76a9ed1bc41838bc52',1,'D3D12MA']]],
+  ['allocator_5fflags_22',['ALLOCATOR_FLAGS',['../namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916',1,'D3D12MA']]],
+  ['allochandle_23',['allocHandle',['../class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c',1,'D3D12MA::Allocation']]],
+  ['allochandle_24',['AllocHandle',['../struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13',1,'D3D12MA::VirtualAllocation::AllocHandle()'],['../namespace_d3_d12_m_a.html#a15e349adce86a40e0417d405aef1af80',1,'D3D12MA::AllocHandle()']]]
 ];
diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js
index 9b22f27..d1226bb 100644
--- a/docs/html/search/all_1.js
+++ b/docs/html/search/all_1.js
@@ -1,8 +1,8 @@
 var searchData=
 [
   ['block_0',['block',['../class_d3_d12_m_a_1_1_allocation.html#a413aec64eba9f4ec57e912511591b3b8',1,'D3D12MA::Allocation']]],
-  ['blockbytes_1',['BlockBytes',['../struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c',1,'D3D12MA::Budget']]],
-  ['blockcount_2',['BlockCount',['../struct_d3_d12_m_a_1_1_stat_info.html#a8284ef3310c9de1600071285448b62c9',1,'D3D12MA::StatInfo']]],
+  ['blockbytes_1',['BlockBytes',['../struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812',1,'D3D12MA::Statistics']]],
+  ['blockcount_2',['BlockCount',['../struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65',1,'D3D12MA::Statistics']]],
   ['blocksize_3',['BlockSize',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#af7284cc51a8ed5b551075584256de23c',1,'D3D12MA::POOL_DESC']]],
   ['budget_4',['Budget',['../struct_d3_d12_m_a_1_1_budget.html',1,'D3D12MA']]],
   ['budgetbytes_5',['BudgetBytes',['../struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71',1,'D3D12MA::Budget']]],
diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js
index cedb820..4161996 100644
--- a/docs/html/search/all_10.js
+++ b/docs/html/search/all_10.js
@@ -4,6 +4,6 @@
   ['setcurrentframeindex_1',['SetCurrentFrameIndex',['../class_d3_d12_m_a_1_1_allocator.html#a468ba0c93121eaaee402b08775f1dd11',1,'D3D12MA::Allocator']]],
   ['setname_2',['SetName',['../class_d3_d12_m_a_1_1_allocation.html#af9e643276b577aa7f21937f75d4b82ac',1,'D3D12MA::Allocation::SetName()'],['../class_d3_d12_m_a_1_1_pool.html#a20617cfec0461cf8c2b92115b5140c5b',1,'D3D12MA::Pool::SetName()']]],
   ['size_3',['Size',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4',1,'D3D12MA::VIRTUAL_BLOCK_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#ac265159500190e35ebef8e4784c73a09',1,'D3D12MA::VIRTUAL_ALLOCATION_INFO::Size()']]],
-  ['statinfo_4',['StatInfo',['../struct_d3_d12_m_a_1_1_stat_info.html',1,'D3D12MA']]],
-  ['stats_5',['Stats',['../struct_d3_d12_m_a_1_1_stats.html',1,'D3D12MA']]]
+  ['statistics_4',['Statistics',['../struct_d3_d12_m_a_1_1_statistics.html',1,'D3D12MA::Statistics'],['../statistics.html',1,'index']]],
+  ['stats_5',['Stats',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f',1,'D3D12MA::DetailedStatistics::Stats()'],['../struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf',1,'D3D12MA::Budget::Stats()']]]
 ];
diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js
index 23da882..7153e01 100644
--- a/docs/html/search/all_11.js
+++ b/docs/html/search/all_11.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['total_0',['Total',['../struct_d3_d12_m_a_1_1_stats.html#ada54d9f0385fcdba491adcfd91f29c28',1,'D3D12MA::Stats']]]
+  ['total_0',['Total',['../struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6',1,'D3D12MA::TotalStatistics']]],
+  ['totalstatistics_1',['TotalStatistics',['../struct_d3_d12_m_a_1_1_total_statistics.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/all_12.js b/docs/html/search/all_12.js
index 13d06a0..9a5b620 100644
--- a/docs/html/search/all_12.js
+++ b/docs/html/search/all_12.js
@@ -1,10 +1,7 @@
 var searchData=
 [
-  ['unusedbytes_0',['UnusedBytes',['../struct_d3_d12_m_a_1_1_stat_info.html#a1df359c2e9ad4c7763122d1ccd86b168',1,'D3D12MA::StatInfo']]],
-  ['unusedrangecount_1',['UnusedRangeCount',['../struct_d3_d12_m_a_1_1_stat_info.html#adfc245a84fb8fba7936b67bd879ffefb',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizeavg_2',['UnusedRangeSizeAvg',['../struct_d3_d12_m_a_1_1_stat_info.html#a249d7969bf3f836c13a0f111d6ed886d',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizemax_3',['UnusedRangeSizeMax',['../struct_d3_d12_m_a_1_1_stat_info.html#a1337269f8777b6b5176c72ca410fbe36',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizemin_4',['UnusedRangeSizeMin',['../struct_d3_d12_m_a_1_1_stat_info.html#a180be027720ca98ff3a7470e18a79622',1,'D3D12MA::StatInfo']]],
-  ['usagebytes_5',['UsageBytes',['../struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253',1,'D3D12MA::Budget']]],
-  ['usedbytes_6',['UsedBytes',['../struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7',1,'D3D12MA::StatInfo']]]
+  ['unusedrangecount_0',['UnusedRangeCount',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9',1,'D3D12MA::DetailedStatistics']]],
+  ['unusedrangesizemax_1',['UnusedRangeSizeMax',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c',1,'D3D12MA::DetailedStatistics']]],
+  ['unusedrangesizemin_2',['UnusedRangeSizeMin',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70',1,'D3D12MA::DetailedStatistics']]],
+  ['usagebytes_3',['UsageBytes',['../struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253',1,'D3D12MA::Budget']]]
 ];
diff --git a/docs/html/search/all_13.js b/docs/html/search/all_13.js
index 1bbed4c..3e67a97 100644
--- a/docs/html/search/all_13.js
+++ b/docs/html/search/all_13.js
@@ -9,9 +9,8 @@
   ['virtual_5fblock_5fdesc_6',['VIRTUAL_BLOCK_DESC',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html',1,'D3D12MA']]],
   ['virtual_5fblock_5fflag_5falgorithm_5flinear_7',['VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d',1,'D3D12MA']]],
   ['virtual_5fblock_5fflag_5falgorithm_5fmask_8',['VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e',1,'D3D12MA']]],
-  ['virtual_5fblock_5fflag_5falgorithm_5ftlsf_9',['VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf',1,'D3D12MA']]],
-  ['virtual_5fblock_5fflag_5fnone_10',['VIRTUAL_BLOCK_FLAG_NONE',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d',1,'D3D12MA']]],
-  ['virtual_5fblock_5fflags_11',['VIRTUAL_BLOCK_FLAGS',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d',1,'D3D12MA']]],
-  ['virtualallocation_12',['VirtualAllocation',['../struct_d3_d12_m_a_1_1_virtual_allocation.html',1,'D3D12MA']]],
-  ['virtualblock_13',['VirtualBlock',['../class_d3_d12_m_a_1_1_virtual_block.html',1,'D3D12MA']]]
+  ['virtual_5fblock_5fflag_5fnone_9',['VIRTUAL_BLOCK_FLAG_NONE',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d',1,'D3D12MA']]],
+  ['virtual_5fblock_5fflags_10',['VIRTUAL_BLOCK_FLAGS',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d',1,'D3D12MA']]],
+  ['virtualallocation_11',['VirtualAllocation',['../struct_d3_d12_m_a_1_1_virtual_allocation.html',1,'D3D12MA']]],
+  ['virtualblock_12',['VirtualBlock',['../class_d3_d12_m_a_1_1_virtual_block.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js
index e66897d..cbf8f81 100644
--- a/docs/html/search/all_2.js
+++ b/docs/html/search/all_2.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['calculatestats_0',['CalculateStats',['../class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e',1,'D3D12MA::Pool::CalculateStats()'],['../class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b',1,'D3D12MA::Allocator::CalculateStats()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526',1,'D3D12MA::VirtualBlock::CalculateStats(StatInfo *pInfo) const']]],
+  ['calculatestatistics_0',['CalculateStatistics',['../class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910',1,'D3D12MA::Pool::CalculateStatistics()'],['../class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22',1,'D3D12MA::Allocator::CalculateStatistics()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9',1,'D3D12MA::VirtualBlock::CalculateStatistics(DetailedStatistics *pStats) const']]],
   ['clear_1',['Clear',['../class_d3_d12_m_a_1_1_virtual_block.html#ae22b18c0b7c31b44c1d740f886369189',1,'D3D12MA::VirtualBlock']]],
   ['configuration_2',['Configuration',['../configuration.html',1,'index']]],
   ['createaliasingresource_3',['CreateAliasingResource',['../class_d3_d12_m_a_1_1_allocator.html#ab45536f92410aedb7be44ea36b1b4717',1,'D3D12MA::Allocator']]],
diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js
index 01aeb20..e34a224 100644
--- a/docs/html/search/all_3.js
+++ b/docs/html/search/all_3.js
@@ -5,5 +5,6 @@
   ['d3d12ma_5fdelete_2',['D3D12MA_DELETE',['../class_d3_d12_m_a_1_1_allocation.html#a968f13f23d03e50cc50b87835b6d5a85',1,'D3D12MA::Allocation::D3D12MA_DELETE()'],['../class_d3_d12_m_a_1_1_pool.html#a968f13f23d03e50cc50b87835b6d5a85',1,'D3D12MA::Pool::D3D12MA_DELETE()'],['../class_d3_d12_m_a_1_1_allocator.html#a968f13f23d03e50cc50b87835b6d5a85',1,'D3D12MA::Allocator::D3D12MA_DELETE()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a968f13f23d03e50cc50b87835b6d5a85',1,'D3D12MA::VirtualBlock::D3D12MA_DELETE()']]],
   ['d3d12ma_5fdxgi_5f1_5f4_3',['D3D12MA_DXGI_1_4',['../_d3_d12_mem_alloc_8h.html#aa623643886b8481adb32017e5c748b50',1,'D3D12MemAlloc.h']]],
   ['d3d12ma_5fuse_5fsmall_5fresource_5fplacement_5falignment_4',['D3D12MA_USE_SMALL_RESOURCE_PLACEMENT_ALIGNMENT',['../_d3_d12_mem_alloc_8h.html#ad04069a2e2bbc53b7d65f85a04a2dcbc',1,'D3D12MemAlloc.h']]],
-  ['d3d12memalloc_2eh_5',['D3D12MemAlloc.h',['../_d3_d12_mem_alloc_8h.html',1,'']]]
+  ['d3d12memalloc_2eh_5',['D3D12MemAlloc.h',['../_d3_d12_mem_alloc_8h.html',1,'']]],
+  ['detailedstatistics_6',['DetailedStatistics',['../struct_d3_d12_m_a_1_1_detailed_statistics.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js
index 4b362f9..71167af 100644
--- a/docs/html/search/all_6.js
+++ b/docs/html/search/all_6.js
@@ -2,12 +2,14 @@
 [
   ['general_20considerations_0',['General considerations',['../general_considerations.html',1,'index']]],
   ['getallocationinfo_1',['GetAllocationInfo',['../class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1',1,'D3D12MA::VirtualBlock']]],
-  ['getbudget_2',['GetBudget',['../class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601',1,'D3D12MA::Allocator']]],
+  ['getbudget_2',['GetBudget',['../class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144',1,'D3D12MA::Allocator']]],
   ['getd3d12options_3',['GetD3D12Options',['../class_d3_d12_m_a_1_1_allocator.html#ae276d2358a58a36f8c6639f837f29be5',1,'D3D12MA::Allocator']]],
   ['getdesc_4',['GetDesc',['../class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028',1,'D3D12MA::Pool']]],
   ['getheap_5',['GetHeap',['../class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2',1,'D3D12MA::Allocation']]],
-  ['getname_6',['GetName',['../class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770',1,'D3D12MA::Allocation::GetName()'],['../class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b',1,'D3D12MA::Pool::GetName()']]],
-  ['getoffset_7',['GetOffset',['../class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60',1,'D3D12MA::Allocation']]],
-  ['getresource_8',['GetResource',['../class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18',1,'D3D12MA::Allocation']]],
-  ['getsize_9',['GetSize',['../class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30',1,'D3D12MA::Allocation']]]
+  ['getmemorycapacity_6',['GetMemoryCapacity',['../class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc',1,'D3D12MA::Allocator']]],
+  ['getname_7',['GetName',['../class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770',1,'D3D12MA::Allocation::GetName()'],['../class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b',1,'D3D12MA::Pool::GetName()']]],
+  ['getoffset_8',['GetOffset',['../class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60',1,'D3D12MA::Allocation']]],
+  ['getresource_9',['GetResource',['../class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18',1,'D3D12MA::Allocation']]],
+  ['getsize_10',['GetSize',['../class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30',1,'D3D12MA::Allocation']]],
+  ['getstatistics_11',['GetStatistics',['../class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91',1,'D3D12MA::Pool::GetStatistics()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110',1,'D3D12MA::VirtualBlock::GetStatistics()']]]
 ];
diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js
index 0fa3ef3..a8c463f 100644
--- a/docs/html/search/all_7.js
+++ b/docs/html/search/all_7.js
@@ -4,5 +4,5 @@
   ['heap_5ftype_5fcount_1',['HEAP_TYPE_COUNT',['../namespace_d3_d12_m_a.html#abad7f40135648f8d0871be36f2919982',1,'D3D12MA']]],
   ['heapflags_2',['HeapFlags',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a3795956e4fbfe7c3a23546e02e5d28dc',1,'D3D12MA::POOL_DESC']]],
   ['heapproperties_3',['HeapProperties',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a06e06813bcb5206e9f7a8b0564bf1d6a',1,'D3D12MA::POOL_DESC']]],
-  ['heaptype_4',['HeapType',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7',1,'D3D12MA::ALLOCATION_DESC::HeapType()'],['../struct_d3_d12_m_a_1_1_stats.html#a6e433945a118a34f7f6565811e62d718',1,'D3D12MA::Stats::HeapType()']]]
+  ['heaptype_4',['HeapType',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7',1,'D3D12MA::ALLOCATION_DESC::HeapType()'],['../struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5',1,'D3D12MA::TotalStatistics::HeapType()']]]
 ];
diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js
index 8155951..0335604 100644
--- a/docs/html/search/all_a.js
+++ b/docs/html/search/all_a.js
@@ -4,6 +4,7 @@
   ['m_5fheap_1',['m_Heap',['../class_d3_d12_m_a_1_1_allocation.html#adc7cf6224b7ca6205d1099a013f40424',1,'D3D12MA::Allocation']]],
   ['m_5fplaced_2',['m_Placed',['../class_d3_d12_m_a_1_1_allocation.html#a35fca5f0b1c5eb46d0bb33cdb7ccc198',1,'D3D12MA::Allocation']]],
   ['maxblockcount_3',['MaxBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#abbce3a99f253928f9c3c09fa16015f9e',1,'D3D12MA::POOL_DESC']]],
-  ['minallocationalignment_4',['MinAllocationAlignment',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749',1,'D3D12MA::POOL_DESC']]],
-  ['minblockcount_5',['MinBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8',1,'D3D12MA::POOL_DESC']]]
+  ['memorysegmentgroup_4',['MemorySegmentGroup',['../struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650',1,'D3D12MA::TotalStatistics']]],
+  ['minallocationalignment_5',['MinAllocationAlignment',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749',1,'D3D12MA::POOL_DESC']]],
+  ['minblockcount_6',['MinBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8',1,'D3D12MA::POOL_DESC']]]
 ];
diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js
index 71f4e8b..d50512c 100644
--- a/docs/html/search/all_d.js
+++ b/docs/html/search/all_d.js
@@ -9,11 +9,10 @@
   ['pool_5fdesc_6',['POOL_DESC',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html',1,'D3D12MA']]],
   ['pool_5fflag_5falgorithm_5flinear_7',['POOL_FLAG_ALGORITHM_LINEAR',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a',1,'D3D12MA']]],
   ['pool_5fflag_5falgorithm_5fmask_8',['POOL_FLAG_ALGORITHM_MASK',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7',1,'D3D12MA']]],
-  ['pool_5fflag_5falgorithm_5ftlsf_9',['POOL_FLAG_ALGORITHM_TLSF',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a',1,'D3D12MA']]],
-  ['pool_5fflag_5fnone_10',['POOL_FLAG_NONE',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02',1,'D3D12MA']]],
-  ['pool_5fflags_11',['POOL_FLAGS',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1',1,'D3D12MA']]],
-  ['pprotectedsession_12',['pProtectedSession',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a475840ec05c19732c8d5aa8bb27270f4',1,'D3D12MA::POOL_DESC']]],
-  ['preferredblocksize_13',['PreferredBlockSize',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#a97149c9559deae943c2cfa49aeeff8a6',1,'D3D12MA::ALLOCATOR_DESC']]],
-  ['prev_14',['prev',['../class_d3_d12_m_a_1_1_allocation.html#adc3ac89758a915a409e047f9b89aa160',1,'D3D12MA::Allocation']]],
-  ['puserdata_15',['pUserData',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#af75391788c1241a06bb0de792c02c335',1,'D3D12MA::ALLOCATION_CALLBACKS::pUserData()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#ab8ec8dd20b4b9dc2aaa79d7da024170b',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC::pUserData()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#a4b23ad296ab6cd425fb3b6c83c13b4ff',1,'D3D12MA::VIRTUAL_ALLOCATION_INFO::pUserData()']]]
+  ['pool_5fflag_5fnone_9',['POOL_FLAG_NONE',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02',1,'D3D12MA']]],
+  ['pool_5fflags_10',['POOL_FLAGS',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1',1,'D3D12MA']]],
+  ['pprotectedsession_11',['pProtectedSession',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a475840ec05c19732c8d5aa8bb27270f4',1,'D3D12MA::POOL_DESC']]],
+  ['preferredblocksize_12',['PreferredBlockSize',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#a97149c9559deae943c2cfa49aeeff8a6',1,'D3D12MA::ALLOCATOR_DESC']]],
+  ['prev_13',['prev',['../class_d3_d12_m_a_1_1_allocation.html#adc3ac89758a915a409e047f9b89aa160',1,'D3D12MA::Allocation']]],
+  ['puserdata_14',['pUserData',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#af75391788c1241a06bb0de792c02c335',1,'D3D12MA::ALLOCATION_CALLBACKS::pUserData()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#ab8ec8dd20b4b9dc2aaa79d7da024170b',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC::pUserData()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#a4b23ad296ab6cd425fb3b6c83c13b4ff',1,'D3D12MA::VIRTUAL_ALLOCATION_INFO::pUserData()']]]
 ];
diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js
index 7ee755f..573a3d5 100644
--- a/docs/html/search/classes_2.js
+++ b/docs/html/search/classes_2.js
@@ -1,5 +1,4 @@
 var searchData=
 [
-  ['pool_0',['Pool',['../class_d3_d12_m_a_1_1_pool.html',1,'D3D12MA']]],
-  ['pool_5fdesc_1',['POOL_DESC',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html',1,'D3D12MA']]]
+  ['detailedstatistics_0',['DetailedStatistics',['../struct_d3_d12_m_a_1_1_detailed_statistics.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js
index c1bf0c4..7ee755f 100644
--- a/docs/html/search/classes_3.js
+++ b/docs/html/search/classes_3.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['statinfo_0',['StatInfo',['../struct_d3_d12_m_a_1_1_stat_info.html',1,'D3D12MA']]],
-  ['stats_1',['Stats',['../struct_d3_d12_m_a_1_1_stats.html',1,'D3D12MA']]]
+  ['pool_0',['Pool',['../class_d3_d12_m_a_1_1_pool.html',1,'D3D12MA']]],
+  ['pool_5fdesc_1',['POOL_DESC',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js
index 0c0c7b5..4c75f7f 100644
--- a/docs/html/search/classes_4.js
+++ b/docs/html/search/classes_4.js
@@ -1,8 +1,4 @@
 var searchData=
 [
-  ['virtual_5fallocation_5fdesc_0',['VIRTUAL_ALLOCATION_DESC',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html',1,'D3D12MA']]],
-  ['virtual_5fallocation_5finfo_1',['VIRTUAL_ALLOCATION_INFO',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html',1,'D3D12MA']]],
-  ['virtual_5fblock_5fdesc_2',['VIRTUAL_BLOCK_DESC',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html',1,'D3D12MA']]],
-  ['virtualallocation_3',['VirtualAllocation',['../struct_d3_d12_m_a_1_1_virtual_allocation.html',1,'D3D12MA']]],
-  ['virtualblock_4',['VirtualBlock',['../class_d3_d12_m_a_1_1_virtual_block.html',1,'D3D12MA']]]
+  ['statistics_0',['Statistics',['../struct_d3_d12_m_a_1_1_statistics.html',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html
new file mode 100644
index 0000000..9b2fcaa
--- /dev/null
+++ b/docs/html/search/classes_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+  if (event.data == "take_focus") {
+    var elem = searchResults.NavNext(0);
+    if (elem) elem.focus();
+  }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js
new file mode 100644
index 0000000..7efd95a
--- /dev/null
+++ b/docs/html/search/classes_5.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['totalstatistics_0',['TotalStatistics',['../struct_d3_d12_m_a_1_1_total_statistics.html',1,'D3D12MA']]]
+];
diff --git a/docs/html/search/classes_6.html b/docs/html/search/classes_6.html
new file mode 100644
index 0000000..16163e7
--- /dev/null
+++ b/docs/html/search/classes_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+  if (event.data == "take_focus") {
+    var elem = searchResults.NavNext(0);
+    if (elem) elem.focus();
+  }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/classes_6.js b/docs/html/search/classes_6.js
new file mode 100644
index 0000000..0c0c7b5
--- /dev/null
+++ b/docs/html/search/classes_6.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['virtual_5fallocation_5fdesc_0',['VIRTUAL_ALLOCATION_DESC',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html',1,'D3D12MA']]],
+  ['virtual_5fallocation_5finfo_1',['VIRTUAL_ALLOCATION_INFO',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html',1,'D3D12MA']]],
+  ['virtual_5fblock_5fdesc_2',['VIRTUAL_BLOCK_DESC',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html',1,'D3D12MA']]],
+  ['virtualallocation_3',['VirtualAllocation',['../struct_d3_d12_m_a_1_1_virtual_allocation.html',1,'D3D12MA']]],
+  ['virtualblock_4',['VirtualBlock',['../class_d3_d12_m_a_1_1_virtual_block.html',1,'D3D12MA']]]
+];
diff --git a/docs/html/search/enumvalues_1.js b/docs/html/search/enumvalues_1.js
index dbcb554..6e3a53d 100644
--- a/docs/html/search/enumvalues_1.js
+++ b/docs/html/search/enumvalues_1.js
@@ -2,6 +2,5 @@
 [
   ['pool_5fflag_5falgorithm_5flinear_0',['POOL_FLAG_ALGORITHM_LINEAR',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a',1,'D3D12MA']]],
   ['pool_5fflag_5falgorithm_5fmask_1',['POOL_FLAG_ALGORITHM_MASK',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7',1,'D3D12MA']]],
-  ['pool_5fflag_5falgorithm_5ftlsf_2',['POOL_FLAG_ALGORITHM_TLSF',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a0dbdb7cee4b4e381851275aa5ca2164a',1,'D3D12MA']]],
-  ['pool_5fflag_5fnone_3',['POOL_FLAG_NONE',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02',1,'D3D12MA']]]
+  ['pool_5fflag_5fnone_2',['POOL_FLAG_NONE',['../namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/enumvalues_2.js b/docs/html/search/enumvalues_2.js
index 06c3a3c..8d5e719 100644
--- a/docs/html/search/enumvalues_2.js
+++ b/docs/html/search/enumvalues_2.js
@@ -4,6 +4,5 @@
   ['virtual_5fallocation_5fflag_5fupper_5faddress_1',['VIRTUAL_ALLOCATION_FLAG_UPPER_ADDRESS',['../namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a86beebcb80a1a10cb5525e2c9ed1435e',1,'D3D12MA']]],
   ['virtual_5fblock_5fflag_5falgorithm_5flinear_2',['VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d',1,'D3D12MA']]],
   ['virtual_5fblock_5fflag_5falgorithm_5fmask_3',['VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e',1,'D3D12MA']]],
-  ['virtual_5fblock_5fflag_5falgorithm_5ftlsf_4',['VIRTUAL_BLOCK_FLAG_ALGORITHM_TLSF',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dab6eea831fa737a4160a81d9c0b2cf3cf',1,'D3D12MA']]],
-  ['virtual_5fblock_5fflag_5fnone_5',['VIRTUAL_BLOCK_FLAG_NONE',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d',1,'D3D12MA']]]
+  ['virtual_5fblock_5fflag_5fnone_4',['VIRTUAL_BLOCK_FLAG_NONE',['../namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d',1,'D3D12MA']]]
 ];
diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js
index 7aad25c..642d3e7 100644
--- a/docs/html/search/functions_2.js
+++ b/docs/html/search/functions_2.js
@@ -1,6 +1,6 @@
 var searchData=
 [
-  ['calculatestats_0',['CalculateStats',['../class_d3_d12_m_a_1_1_pool.html#a8e4cc5fb13aa33398d391296336c457e',1,'D3D12MA::Pool::CalculateStats()'],['../class_d3_d12_m_a_1_1_allocator.html#addedcd0067319ec566042f5cb520843b',1,'D3D12MA::Allocator::CalculateStats()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526',1,'D3D12MA::VirtualBlock::CalculateStats(StatInfo *pInfo) const']]],
+  ['calculatestatistics_0',['CalculateStatistics',['../class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910',1,'D3D12MA::Pool::CalculateStatistics()'],['../class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22',1,'D3D12MA::Allocator::CalculateStatistics()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9',1,'D3D12MA::VirtualBlock::CalculateStatistics(DetailedStatistics *pStats) const']]],
   ['clear_1',['Clear',['../class_d3_d12_m_a_1_1_virtual_block.html#ae22b18c0b7c31b44c1d740f886369189',1,'D3D12MA::VirtualBlock']]],
   ['createaliasingresource_2',['CreateAliasingResource',['../class_d3_d12_m_a_1_1_allocator.html#ab45536f92410aedb7be44ea36b1b4717',1,'D3D12MA::Allocator']]],
   ['createallocator_3',['CreateAllocator',['../namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0',1,'D3D12MA']]],
diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js
index 217586e..7931cdc 100644
--- a/docs/html/search/functions_4.js
+++ b/docs/html/search/functions_4.js
@@ -1,12 +1,14 @@
 var searchData=
 [
   ['getallocationinfo_0',['GetAllocationInfo',['../class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1',1,'D3D12MA::VirtualBlock']]],
-  ['getbudget_1',['GetBudget',['../class_d3_d12_m_a_1_1_allocator.html#abe927bd3ad6930111d4d9408515b9601',1,'D3D12MA::Allocator']]],
+  ['getbudget_1',['GetBudget',['../class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144',1,'D3D12MA::Allocator']]],
   ['getd3d12options_2',['GetD3D12Options',['../class_d3_d12_m_a_1_1_allocator.html#ae276d2358a58a36f8c6639f837f29be5',1,'D3D12MA::Allocator']]],
   ['getdesc_3',['GetDesc',['../class_d3_d12_m_a_1_1_pool.html#aaab59af46d922d6b81fce8d8be987028',1,'D3D12MA::Pool']]],
   ['getheap_4',['GetHeap',['../class_d3_d12_m_a_1_1_allocation.html#adca8d5a82bed492fe7265fcda6e53da2',1,'D3D12MA::Allocation']]],
-  ['getname_5',['GetName',['../class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770',1,'D3D12MA::Allocation::GetName()'],['../class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b',1,'D3D12MA::Pool::GetName()']]],
-  ['getoffset_6',['GetOffset',['../class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60',1,'D3D12MA::Allocation']]],
-  ['getresource_7',['GetResource',['../class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18',1,'D3D12MA::Allocation']]],
-  ['getsize_8',['GetSize',['../class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30',1,'D3D12MA::Allocation']]]
+  ['getmemorycapacity_5',['GetMemoryCapacity',['../class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc',1,'D3D12MA::Allocator']]],
+  ['getname_6',['GetName',['../class_d3_d12_m_a_1_1_allocation.html#a65fab0c479df1b6b72c9300e68dc6770',1,'D3D12MA::Allocation::GetName()'],['../class_d3_d12_m_a_1_1_pool.html#a63c91d92a9ca48b98866a5cc1aea333b',1,'D3D12MA::Pool::GetName()']]],
+  ['getoffset_7',['GetOffset',['../class_d3_d12_m_a_1_1_allocation.html#a47be9557d441797b65de177a3d5cdf60',1,'D3D12MA::Allocation']]],
+  ['getresource_8',['GetResource',['../class_d3_d12_m_a_1_1_allocation.html#ad00308118252f82d8f803c623c67bf18',1,'D3D12MA::Allocation']]],
+  ['getsize_9',['GetSize',['../class_d3_d12_m_a_1_1_allocation.html#a92c2fb6f22b28817eb83a59407d7dd30',1,'D3D12MA::Allocation']]],
+  ['getstatistics_10',['GetStatistics',['../class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91',1,'D3D12MA::Pool::GetStatistics()'],['../class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110',1,'D3D12MA::VirtualBlock::GetStatistics()']]]
 ];
diff --git a/docs/html/search/pages_6.js b/docs/html/search/pages_6.js
index f91f65a..36172ec 100644
--- a/docs/html/search/pages_6.js
+++ b/docs/html/search/pages_6.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['virtual_20allocator_0',['Virtual allocator',['../virtual_allocator.html',1,'index']]]
+  ['statistics_0',['Statistics',['../statistics.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_7.html b/docs/html/search/pages_7.html
new file mode 100644
index 0000000..10d9d32
--- /dev/null
+++ b/docs/html/search/pages_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+  if (event.data == "take_focus") {
+    var elem = searchResults.NavNext(0);
+    if (elem) elem.focus();
+  }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/pages_7.js b/docs/html/search/pages_7.js
new file mode 100644
index 0000000..f91f65a
--- /dev/null
+++ b/docs/html/search/pages_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['virtual_20allocator_0',['Virtual allocator',['../virtual_allocator.html',1,'index']]]
+];
diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js
index f98d5ea..dec86bc 100644
--- a/docs/html/search/searchdata.js
+++ b/docs/html/search/searchdata.js
@@ -1,7 +1,7 @@
 var indexSectionsWithContent =
 {
   0: "abcdefghilmnopqrstuvw",
-  1: "abpsv",
+  1: "abdpstv",
   2: "d",
   3: "d",
   4: "abcfgisw",
@@ -11,7 +11,7 @@
   8: "apv",
   9: "cd",
   10: "d",
-  11: "cdglqrv"
+  11: "cdglqrsv"
 };
 
 var indexSectionNames =
diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js
index 4af1b98..b248e0e 100644
--- a/docs/html/search/variables_0.js
+++ b/docs/html/search/variables_0.js
@@ -1,11 +1,10 @@
 var searchData=
 [
   ['alignment_0',['Alignment',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aaa95e62f2f399339a09dcbb312a42de0',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC']]],
-  ['allocationbytes_1',['AllocationBytes',['../struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099',1,'D3D12MA::Budget']]],
-  ['allocationcount_2',['AllocationCount',['../struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e',1,'D3D12MA::StatInfo']]],
-  ['allocationsizeavg_3',['AllocationSizeAvg',['../struct_d3_d12_m_a_1_1_stat_info.html#acf3339540ff01d93b6a6f5dc68d83f60',1,'D3D12MA::StatInfo']]],
-  ['allocationsizemax_4',['AllocationSizeMax',['../struct_d3_d12_m_a_1_1_stat_info.html#acd3c6f72ffb61a8d39b65a3dab317eb6',1,'D3D12MA::StatInfo']]],
-  ['allocationsizemin_5',['AllocationSizeMin',['../struct_d3_d12_m_a_1_1_stat_info.html#a9d9e69e9cad231fea3a41b06e7eeee35',1,'D3D12MA::StatInfo']]],
-  ['allochandle_6',['AllocHandle',['../struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13',1,'D3D12MA::VirtualAllocation']]],
-  ['allochandle_7',['allocHandle',['../class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c',1,'D3D12MA::Allocation']]]
+  ['allocationbytes_1',['AllocationBytes',['../struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8',1,'D3D12MA::Statistics']]],
+  ['allocationcount_2',['AllocationCount',['../struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68',1,'D3D12MA::Statistics']]],
+  ['allocationsizemax_3',['AllocationSizeMax',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991',1,'D3D12MA::DetailedStatistics']]],
+  ['allocationsizemin_4',['AllocationSizeMin',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a',1,'D3D12MA::DetailedStatistics']]],
+  ['allochandle_5',['allocHandle',['../class_d3_d12_m_a_1_1_allocation.html#a5c38846905b1ca0ff228c6081f2fc20c',1,'D3D12MA::Allocation']]],
+  ['allochandle_6',['AllocHandle',['../struct_d3_d12_m_a_1_1_virtual_allocation.html#a5d3166cf1f284fbbea4d0b169c4dba13',1,'D3D12MA::VirtualAllocation']]]
 ];
diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js
index 0635992..399dacb 100644
--- a/docs/html/search/variables_1.js
+++ b/docs/html/search/variables_1.js
@@ -1,8 +1,8 @@
 var searchData=
 [
   ['block_0',['block',['../class_d3_d12_m_a_1_1_allocation.html#a413aec64eba9f4ec57e912511591b3b8',1,'D3D12MA::Allocation']]],
-  ['blockbytes_1',['BlockBytes',['../struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c',1,'D3D12MA::Budget']]],
-  ['blockcount_2',['BlockCount',['../struct_d3_d12_m_a_1_1_stat_info.html#a8284ef3310c9de1600071285448b62c9',1,'D3D12MA::StatInfo']]],
+  ['blockbytes_1',['BlockBytes',['../struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812',1,'D3D12MA::Statistics']]],
+  ['blockcount_2',['BlockCount',['../struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65',1,'D3D12MA::Statistics']]],
   ['blocksize_3',['BlockSize',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#af7284cc51a8ed5b551075584256de23c',1,'D3D12MA::POOL_DESC']]],
   ['budgetbytes_4',['BudgetBytes',['../struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71',1,'D3D12MA::Budget']]]
 ];
diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js
index 0fa3ef3..a8c463f 100644
--- a/docs/html/search/variables_5.js
+++ b/docs/html/search/variables_5.js
@@ -4,5 +4,5 @@
   ['heap_5ftype_5fcount_1',['HEAP_TYPE_COUNT',['../namespace_d3_d12_m_a.html#abad7f40135648f8d0871be36f2919982',1,'D3D12MA']]],
   ['heapflags_2',['HeapFlags',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a3795956e4fbfe7c3a23546e02e5d28dc',1,'D3D12MA::POOL_DESC']]],
   ['heapproperties_3',['HeapProperties',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a06e06813bcb5206e9f7a8b0564bf1d6a',1,'D3D12MA::POOL_DESC']]],
-  ['heaptype_4',['HeapType',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7',1,'D3D12MA::ALLOCATION_DESC::HeapType()'],['../struct_d3_d12_m_a_1_1_stats.html#a6e433945a118a34f7f6565811e62d718',1,'D3D12MA::Stats::HeapType()']]]
+  ['heaptype_4',['HeapType',['../struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aa46b3c0456e5a23edef3328607ebf4d7',1,'D3D12MA::ALLOCATION_DESC::HeapType()'],['../struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5',1,'D3D12MA::TotalStatistics::HeapType()']]]
 ];
diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js
index 8155951..0335604 100644
--- a/docs/html/search/variables_7.js
+++ b/docs/html/search/variables_7.js
@@ -4,6 +4,7 @@
   ['m_5fheap_1',['m_Heap',['../class_d3_d12_m_a_1_1_allocation.html#adc7cf6224b7ca6205d1099a013f40424',1,'D3D12MA::Allocation']]],
   ['m_5fplaced_2',['m_Placed',['../class_d3_d12_m_a_1_1_allocation.html#a35fca5f0b1c5eb46d0bb33cdb7ccc198',1,'D3D12MA::Allocation']]],
   ['maxblockcount_3',['MaxBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#abbce3a99f253928f9c3c09fa16015f9e',1,'D3D12MA::POOL_DESC']]],
-  ['minallocationalignment_4',['MinAllocationAlignment',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749',1,'D3D12MA::POOL_DESC']]],
-  ['minblockcount_5',['MinBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8',1,'D3D12MA::POOL_DESC']]]
+  ['memorysegmentgroup_4',['MemorySegmentGroup',['../struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650',1,'D3D12MA::TotalStatistics']]],
+  ['minallocationalignment_5',['MinAllocationAlignment',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a0a6283eeb1f3f99d8c4ae264aec7f749',1,'D3D12MA::POOL_DESC']]],
+  ['minblockcount_6',['MinBlockCount',['../struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#a6f10db3911a3bea1becfc9a0dfa5bac8',1,'D3D12MA::POOL_DESC']]]
 ];
diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js
index 1b4827e..542f730 100644
--- a/docs/html/search/variables_b.js
+++ b/docs/html/search/variables_b.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['size_0',['Size',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4',1,'D3D12MA::VIRTUAL_BLOCK_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#ac265159500190e35ebef8e4784c73a09',1,'D3D12MA::VIRTUAL_ALLOCATION_INFO::Size()']]]
+  ['size_0',['Size',['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4',1,'D3D12MA::VIRTUAL_BLOCK_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac',1,'D3D12MA::VIRTUAL_ALLOCATION_DESC::Size()'],['../struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#ac265159500190e35ebef8e4784c73a09',1,'D3D12MA::VIRTUAL_ALLOCATION_INFO::Size()']]],
+  ['stats_1',['Stats',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f',1,'D3D12MA::DetailedStatistics::Stats()'],['../struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf',1,'D3D12MA::Budget::Stats()']]]
 ];
diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js
index 23da882..47aa9f8 100644
--- a/docs/html/search/variables_c.js
+++ b/docs/html/search/variables_c.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['total_0',['Total',['../struct_d3_d12_m_a_1_1_stats.html#ada54d9f0385fcdba491adcfd91f29c28',1,'D3D12MA::Stats']]]
+  ['total_0',['Total',['../struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6',1,'D3D12MA::TotalStatistics']]]
 ];
diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js
index 13d06a0..9a5b620 100644
--- a/docs/html/search/variables_d.js
+++ b/docs/html/search/variables_d.js
@@ -1,10 +1,7 @@
 var searchData=
 [
-  ['unusedbytes_0',['UnusedBytes',['../struct_d3_d12_m_a_1_1_stat_info.html#a1df359c2e9ad4c7763122d1ccd86b168',1,'D3D12MA::StatInfo']]],
-  ['unusedrangecount_1',['UnusedRangeCount',['../struct_d3_d12_m_a_1_1_stat_info.html#adfc245a84fb8fba7936b67bd879ffefb',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizeavg_2',['UnusedRangeSizeAvg',['../struct_d3_d12_m_a_1_1_stat_info.html#a249d7969bf3f836c13a0f111d6ed886d',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizemax_3',['UnusedRangeSizeMax',['../struct_d3_d12_m_a_1_1_stat_info.html#a1337269f8777b6b5176c72ca410fbe36',1,'D3D12MA::StatInfo']]],
-  ['unusedrangesizemin_4',['UnusedRangeSizeMin',['../struct_d3_d12_m_a_1_1_stat_info.html#a180be027720ca98ff3a7470e18a79622',1,'D3D12MA::StatInfo']]],
-  ['usagebytes_5',['UsageBytes',['../struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253',1,'D3D12MA::Budget']]],
-  ['usedbytes_6',['UsedBytes',['../struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7',1,'D3D12MA::StatInfo']]]
+  ['unusedrangecount_0',['UnusedRangeCount',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9',1,'D3D12MA::DetailedStatistics']]],
+  ['unusedrangesizemax_1',['UnusedRangeSizeMax',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c',1,'D3D12MA::DetailedStatistics']]],
+  ['unusedrangesizemin_2',['UnusedRangeSizeMin',['../struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70',1,'D3D12MA::DetailedStatistics']]],
+  ['usagebytes_3',['UsageBytes',['../struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253',1,'D3D12MA::Budget']]]
 ];
diff --git a/docs/html/statistics.html b/docs/html/statistics.html
new file mode 100644
index 0000000..55f04ef
--- /dev/null
+++ b/docs/html/statistics.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 Memory Allocator: Statistics</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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">D3D12 Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div><div class="header">
+  <div class="headertitle"><div class="title">Statistics </div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p >This library contains several functions that return information about its internal state, especially the amount of memory allocated from D3D12.</p>
+<h1><a class="anchor" id="statistics_numeric_statistics"></a>
+Numeric statistics</h1>
+<p >If you need to obtain basic statistics about memory usage per memory segment group, together with current budget, you can call function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144" title="Retrieves information about current memory usage and budget.">D3D12MA::Allocator::GetBudget()</a> and inspect structure <a class="el" href="struct_d3_d12_m_a_1_1_budget.html" title="Statistics of current memory usage and available budget for a specific memory segment group.">D3D12MA::Budget</a>. This is useful to keep track of memory usage and stay withing budget. Example:</p>
+<div class="fragment"><div class="line"><a class="code hl_struct" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a> localBudget;</div>
+<div class="line">allocator-&gt;GetBudget(&amp;localBudget, NULL);</div>
+<div class="line"> </div>
+<div class="line">printf(<span class="stringliteral">&quot;My GPU memory currently has %u allocations taking %llu B,\n&quot;</span>,</div>
+<div class="line">    localBudget.Statistics.AllocationCount,</div>
+<div class="line">    localBudget.Statistics.AllocationBytes);</div>
+<div class="line">printf(<span class="stringliteral">&quot;allocated out of %u D3D12 memory heaps taking %llu B,\n&quot;</span>,</div>
+<div class="line">    localBudget.Statistics.BlockCount,</div>
+<div class="line">    localBudget.Statistics.BlockBytes);</div>
+<div class="line">printf(<span class="stringliteral">&quot;D3D12 reports total usage %llu B with budget %llu B.\n&quot;</span>,</div>
+<div class="line">    localBudget.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">UsageBytes</a>,</div>
+<div class="line">    localBudget.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">BudgetBytes</a>);</div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_budget_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></div><div class="ttdoc">Statistics of current memory usage and available budget for a specific memory segment group.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:372</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_budget_html_a326515f08d89ee2e31dcfdd5c1e8ac71"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">D3D12MA::Budget::BudgetBytes</a></div><div class="ttdeci">UINT64 BudgetBytes</div><div class="ttdoc">Estimated amount of memory available to the program.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:395</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_budget_html_a77a8c9e32d6602f95b7d1c285cddd253"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">D3D12MA::Budget::UsageBytes</a></div><div class="ttdeci">UINT64 UsageBytes</div><div class="ttdoc">Estimated current memory usage of the program.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:384</div></div>
+</div><!-- fragment --><p >You can query for more detailed statistics per heap type, memory segment group, and totals, including minimum and maximum allocation size and unused range size, by calling function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22" title="Retrieves statistics from current state of the allocator.">D3D12MA::Allocator::CalculateStatistics()</a> and inspecting structure <a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html" title="General statistics from current state of the allocator - total memory usage across all memory heaps a...">D3D12MA::TotalStatistics</a>. This function is slower though, as it has to traverse all the internal data structures, so it should be used only for debugging purposes.</p>
+<p >You can query for statistics of a custom pool using function <a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91" title="Retrieves basic statistics of the custom pool that are fast to calculate.">D3D12MA::Pool::GetStatistics()</a> or <a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910" title="Retrieves detailed statistics of the custom pool that are slower to calculate.">D3D12MA::Pool::CalculateStatistics()</a>.</p>
+<p >You can query for information about a specific allocation using functions of the <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> class, e.g. <code>GetSize()</code>, <code>GetOffset()</code>, <code>GetHeap()</code>.</p>
+<h1><a class="anchor" id="statistics_json_dump"></a>
+JSON dump</h1>
+<p >You can dump internal state of the allocator to a string in JSON format using function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a29716b3084916abed7793bf2ec4b65db" title="Builds and returns statistics as a string in JSON format.">D3D12MA::Allocator::BuildStatsString()</a>. The result is guaranteed to be correct JSON. It uses Windows Unicode (UTF-16) encoding. Any strings provided by user (see <a class="el" href="class_d3_d12_m_a_1_1_allocation.html#af9e643276b577aa7f21937f75d4b82ac" title="Associates a name with the allocation object. This name is for use in debug diagnostics and tools.">D3D12MA::Allocation::SetName()</a>) are copied as-is and properly escaped for JSON. It must be freed using function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a8392663494384c16d8bfa12b827b4f9c" title="Frees memory of a string returned from Allocator::BuildStatsString.">D3D12MA::Allocator::FreeStatsString()</a>.</p>
+<p >The format of this JSON string is not part of official documentation of the library, but it will not change in backward-incompatible way without increasing library major version number and appropriate mention in changelog.</p>
+<p >The JSON string contains all the data that can be obtained using <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22" title="Retrieves statistics from current state of the allocator.">D3D12MA::Allocator::CalculateStatistics()</a>. It can also contain detailed map of allocated memory blocks and their regions - free and occupied by allocations. This allows e.g. to visualize the memory or assess fragmentation. </p>
+</div></div><!-- contents -->
+</div><!-- PageDoc -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_budget-members.html b/docs/html/struct_d3_d12_m_a_1_1_budget-members.html
index f96f961..f10d638 100644
--- a/docs/html/struct_d3_d12_m_a_1_1_budget-members.html
+++ b/docs/html/struct_d3_d12_m_a_1_1_budget-members.html
@@ -72,10 +72,9 @@
 
 <p>This is the complete list of members for <a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099">AllocationBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td><td class="entry"></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c">BlockBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">BudgetBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td><td class="entry"></td></tr>
-  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">UsageBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf">Stats</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">UsageBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</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_d3_d12_m_a_1_1_budget.html b/docs/html/struct_d3_d12_m_a_1_1_budget.html
index 1f7ec76..4f6e0ba 100644
--- a/docs/html/struct_d3_d12_m_a_1_1_budget.html
+++ b/docs/html/struct_d3_d12_m_a_1_1_budget.html
@@ -73,62 +73,27 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory.  
+<p>Statistics of current memory usage and available budget for a specific memory segment group.  
  <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a></p>
 
 <p><code>#include &lt;D3D12MemAlloc.h&gt;</code></p>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
 Public Attributes</h2></td></tr>
-<tr class="memitem:ad1ad5d8521993cb623255ee1709a1c4c"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c">BlockBytes</a></td></tr>
-<tr class="memdesc:ad1ad5d8521993cb623255ee1709a1c4c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum size of all memory blocks allocated from particular heap type, in bytes.  <a href="struct_d3_d12_m_a_1_1_budget.html#ad1ad5d8521993cb623255ee1709a1c4c">More...</a><br /></td></tr>
-<tr class="separator:ad1ad5d8521993cb623255ee1709a1c4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abcb043908bd528852f8ef3867ad76099"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099">AllocationBytes</a></td></tr>
-<tr class="memdesc:abcb043908bd528852f8ef3867ad76099"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sum size of all allocations created in particular heap type, in bytes.  <a href="struct_d3_d12_m_a_1_1_budget.html#abcb043908bd528852f8ef3867ad76099">More...</a><br /></td></tr>
-<tr class="separator:abcb043908bd528852f8ef3867ad76099"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1255508930766db238cfb1312b15f1cf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf">Stats</a></td></tr>
+<tr class="memdesc:a1255508930766db238cfb1312b15f1cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics fetched from the library.  <a href="struct_d3_d12_m_a_1_1_budget.html#a1255508930766db238cfb1312b15f1cf">More...</a><br /></td></tr>
+<tr class="separator:a1255508930766db238cfb1312b15f1cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a77a8c9e32d6602f95b7d1c285cddd253"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">UsageBytes</a></td></tr>
-<tr class="memdesc:a77a8c9e32d6602f95b7d1c285cddd253"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated current memory usage of the program, in bytes.  <a href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">More...</a><br /></td></tr>
+<tr class="memdesc:a77a8c9e32d6602f95b7d1c285cddd253"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated current memory usage of the program.  <a href="struct_d3_d12_m_a_1_1_budget.html#a77a8c9e32d6602f95b7d1c285cddd253">More...</a><br /></td></tr>
 <tr class="separator:a77a8c9e32d6602f95b7d1c285cddd253"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a326515f08d89ee2e31dcfdd5c1e8ac71"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">BudgetBytes</a></td></tr>
-<tr class="memdesc:a326515f08d89ee2e31dcfdd5c1e8ac71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated amount of memory available to the program, in bytes.  <a href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">More...</a><br /></td></tr>
+<tr class="memdesc:a326515f08d89ee2e31dcfdd5c1e8ac71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated amount of memory available to the program.  <a href="struct_d3_d12_m_a_1_1_budget.html#a326515f08d89ee2e31dcfdd5c1e8ac71">More...</a><br /></td></tr>
 <tr class="separator:a326515f08d89ee2e31dcfdd5c1e8ac71"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p >Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory. </p>
+<div class="textblock"><p >Statistics of current memory usage and available budget for a specific memory segment group. </p>
+<p >These are fast to calculate. See function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144" title="Retrieves information about current memory usage and budget.">D3D12MA::Allocator::GetBudget()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
-<a id="abcb043908bd528852f8ef3867ad76099" name="abcb043908bd528852f8ef3867ad76099"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#abcb043908bd528852f8ef3867ad76099">&#9670;&nbsp;</a></span>AllocationBytes</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">UINT64 D3D12MA::Budget::AllocationBytes</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Sum size of all allocations created in particular heap type, in bytes. </p>
-<p >Always less or equal than <code>BlockBytes</code>. Difference <code>BlockBytes - AllocationBytes</code> is the amount of memory allocated but unused - available for new allocations or wasted due to fragmentation. </p>
-
-</div>
-</div>
-<a id="ad1ad5d8521993cb623255ee1709a1c4c" name="ad1ad5d8521993cb623255ee1709a1c4c"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ad1ad5d8521993cb623255ee1709a1c4c">&#9670;&nbsp;</a></span>BlockBytes</h2>
-
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">UINT64 D3D12MA::Budget::BlockBytes</td>
-        </tr>
-      </table>
-</div><div class="memdoc">
-
-<p>Sum size of all memory blocks allocated from particular heap type, in bytes. </p>
-
-</div>
-</div>
 <a id="a326515f08d89ee2e31dcfdd5c1e8ac71" name="a326515f08d89ee2e31dcfdd5c1e8ac71"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a326515f08d89ee2e31dcfdd5c1e8ac71">&#9670;&nbsp;</a></span>BudgetBytes</h2>
 
@@ -141,9 +106,25 @@
       </table>
 </div><div class="memdoc">
 
-<p>Estimated amount of memory available to the program, in bytes. </p>
-<p >Fetched from system using <code>IDXGIAdapter3::QueryVideoMemoryInfo</code> if enabled.</p>
-<p >It might be different (most probably smaller) than memory sizes reported in <code>DXGI_ADAPTER_DESC</code> due to factors external to the program, like other programs also consuming system resources. Difference <code>BudgetBytes - UsageBytes</code> is the amount of additional memory that can probably be allocated without problems. Exceeding the budget may result in various problems. </p>
+<p>Estimated amount of memory available to the program. </p>
+<p >Fetched from system using <code>IDXGIAdapter3::QueryVideoMemoryInfo</code> if possible.</p>
+<p >It might be different (most probably smaller) than memory capacity returned by <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a434ae3147209953253da26687bfd62dc" title="Returns total amount of memory of specific segment group, in bytes.">D3D12MA::Allocator::GetMemoryCapacity()</a> due to factors external to the program, like other programs also consuming system resources. Difference <code>BudgetBytes - UsageBytes</code> is the amount of additional memory that can probably be allocated without problems. Exceeding the budget may result in various problems. </p>
+
+</div>
+</div>
+<a id="a1255508930766db238cfb1312b15f1cf" name="a1255508930766db238cfb1312b15f1cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1255508930766db238cfb1312b15f1cf">&#9670;&nbsp;</a></span>Stats</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> D3D12MA::Budget::Stats</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Statistics fetched from the library. </p>
 
 </div>
 </div>
@@ -159,9 +140,9 @@
       </table>
 </div><div class="memdoc">
 
-<p>Estimated current memory usage of the program, in bytes. </p>
-<p >Fetched from system using <code>IDXGIAdapter3::QueryVideoMemoryInfo</code> if enabled.</p>
-<p >It might be different than <code>BlockBytes</code> (usually higher) due to additional implicit objects also occupying the memory, like swapchain, pipeline state objects, descriptor heaps, command lists, or memory blocks allocated outside of this library, if any. </p>
+<p>Estimated current memory usage of the program. </p>
+<p >Fetched from system using <code>IDXGIAdapter3::QueryVideoMemoryInfo</code> if possible.</p>
+<p >It might be different than <code>BlockBytes</code> (usually higher) due to additional implicit objects also occupying the memory, like swapchain, pipeline state objects, descriptor heaps, command lists, or heaps and resources allocated outside of this library, if any. </p>
 
 </div>
 </div>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics-members.html b/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics-members.html
new file mode 100644
index 0000000..47da2bc
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics-members.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle"><div class="title">D3D12MA::DetailedStatistics Member List</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991">AllocationSizeMax</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a">AllocationSizeMin</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f">Stats</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9">UnusedRangeCount</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c">UnusedRangeSizeMax</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70">UnusedRangeSizeMin</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</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="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics.html b/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics.html
new file mode 100644
index 0000000..3398e3c
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_detailed_statistics.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 Memory Allocator: D3D12MA::DetailedStatistics 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="struct_d3_d12_m_a_1_1_detailed_statistics-members.html">List of all members</a>  </div>
+  <div class="headertitle"><div class="title">D3D12MA::DetailedStatistics Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a>.  
+ <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#details">More...</a></p>
+
+<p><code>#include &lt;D3D12MemAlloc.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a2490d4a08a5d47c87a699001dfc8737f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f">Stats</a></td></tr>
+<tr class="memdesc:a2490d4a08a5d47c87a699001dfc8737f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Basic statistics.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2490d4a08a5d47c87a699001dfc8737f">More...</a><br /></td></tr>
+<tr class="separator:a2490d4a08a5d47c87a699001dfc8737f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff1aaecbb86eedfdb15c1b11987ac0d9"><td class="memItemLeft" align="right" valign="top">UINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9">UnusedRangeCount</a></td></tr>
+<tr class="memdesc:aff1aaecbb86eedfdb15c1b11987ac0d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of free ranges of memory between allocations.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#aff1aaecbb86eedfdb15c1b11987ac0d9">More...</a><br /></td></tr>
+<tr class="separator:aff1aaecbb86eedfdb15c1b11987ac0d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a187e5562265c3daa87c15d54f1396a6a"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a">AllocationSizeMin</a></td></tr>
+<tr class="memdesc:a187e5562265c3daa87c15d54f1396a6a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Smallest allocation size. <code>UINT64_MAX</code> if there are 0 allocations.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a187e5562265c3daa87c15d54f1396a6a">More...</a><br /></td></tr>
+<tr class="separator:a187e5562265c3daa87c15d54f1396a6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f47015bebf9a30ce221aef88fe11991"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991">AllocationSizeMax</a></td></tr>
+<tr class="memdesc:a2f47015bebf9a30ce221aef88fe11991"><td class="mdescLeft">&#160;</td><td class="mdescRight">Largest allocation size. 0 if there are 0 allocations.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a2f47015bebf9a30ce221aef88fe11991">More...</a><br /></td></tr>
+<tr class="separator:a2f47015bebf9a30ce221aef88fe11991"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac13f6cb1737f0d906e55182385f38b70"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70">UnusedRangeSizeMin</a></td></tr>
+<tr class="memdesc:ac13f6cb1737f0d906e55182385f38b70"><td class="mdescLeft">&#160;</td><td class="mdescRight">Smallest empty range size. <code>UINT64_MAX</code> if there are 0 empty ranges.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#ac13f6cb1737f0d906e55182385f38b70">More...</a><br /></td></tr>
+<tr class="separator:ac13f6cb1737f0d906e55182385f38b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5fae01864d6e6595cb9c416a9f365e7c"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c">UnusedRangeSizeMax</a></td></tr>
+<tr class="memdesc:a5fae01864d6e6595cb9c416a9f365e7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Largest empty range size. 0 if there are 0 empty ranges.  <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#a5fae01864d6e6595cb9c416a9f365e7c">More...</a><br /></td></tr>
+<tr class="separator:a5fae01864d6e6595cb9c416a9f365e7c"><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 >More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a>. </p>
+<p >These are slower to calculate. Use for debugging purposes. See functions: <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22" title="Retrieves statistics from current state of the allocator.">D3D12MA::Allocator::CalculateStatistics()</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#ad07999ac5dc8f0c63187afd45d551910" title="Retrieves detailed statistics of the custom pool that are slower to calculate.">D3D12MA::Pool::CalculateStatistics()</a>.</p>
+<p >Averages are not provided because they can be easily calculated as:</p>
+<div class="fragment"><div class="line">UINT64 AllocationSizeAvg = DetailedStats.Statistics.AllocationBytes / detailedStats.Statistics.AllocationCount;</div>
+<div class="line">UINT64 UnusedBytes = DetailedStats.Statistics.BlockBytes - DetailedStats.Statistics.AllocationBytes;</div>
+<div class="line">UINT64 UnusedRangeSizeAvg = UnusedBytes / DetailedStats.UnusedRangeCount;</div>
+</div><!-- fragment --> </div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="a2f47015bebf9a30ce221aef88fe11991" name="a2f47015bebf9a30ce221aef88fe11991"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f47015bebf9a30ce221aef88fe11991">&#9670;&nbsp;</a></span>AllocationSizeMax</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::DetailedStatistics::AllocationSizeMax</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Largest allocation size. 0 if there are 0 allocations. </p>
+
+</div>
+</div>
+<a id="a187e5562265c3daa87c15d54f1396a6a" name="a187e5562265c3daa87c15d54f1396a6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a187e5562265c3daa87c15d54f1396a6a">&#9670;&nbsp;</a></span>AllocationSizeMin</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::DetailedStatistics::AllocationSizeMin</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Smallest allocation size. <code>UINT64_MAX</code> if there are 0 allocations. </p>
+
+</div>
+</div>
+<a id="a2490d4a08a5d47c87a699001dfc8737f" name="a2490d4a08a5d47c87a699001dfc8737f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2490d4a08a5d47c87a699001dfc8737f">&#9670;&nbsp;</a></span>Stats</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a> D3D12MA::DetailedStatistics::Stats</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Basic statistics. </p>
+
+</div>
+</div>
+<a id="aff1aaecbb86eedfdb15c1b11987ac0d9" name="aff1aaecbb86eedfdb15c1b11987ac0d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff1aaecbb86eedfdb15c1b11987ac0d9">&#9670;&nbsp;</a></span>UnusedRangeCount</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT D3D12MA::DetailedStatistics::UnusedRangeCount</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of free ranges of memory between allocations. </p>
+
+</div>
+</div>
+<a id="a5fae01864d6e6595cb9c416a9f365e7c" name="a5fae01864d6e6595cb9c416a9f365e7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5fae01864d6e6595cb9c416a9f365e7c">&#9670;&nbsp;</a></span>UnusedRangeSizeMax</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::DetailedStatistics::UnusedRangeSizeMax</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Largest empty range size. 0 if there are 0 empty ranges. </p>
+
+</div>
+</div>
+<a id="ac13f6cb1737f0d906e55182385f38b70" name="ac13f6cb1737f0d906e55182385f38b70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac13f6cb1737f0d906e55182385f38b70">&#9670;&nbsp;</a></span>UnusedRangeSizeMin</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::DetailedStatistics::UnusedRangeSizeMin</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Smallest empty range size. <code>UINT64_MAX</code> if there are 0 empty ranges. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>D:/PROJECTS/D3D12 Memory Allocator/REPO/include/<a class="el" href="_d3_d12_mem_alloc_8h.html">D3D12MemAlloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_statistics-members.html b/docs/html/struct_d3_d12_m_a_1_1_statistics-members.html
new file mode 100644
index 0000000..c98f015
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_statistics-members.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle"><div class="title">D3D12MA::Statistics Member List</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">AllocationBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">AllocationCount</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812">BlockBytes</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65">BlockCount</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</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="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_statistics.html b/docs/html/struct_d3_d12_m_a_1_1_statistics.html
new file mode 100644
index 0000000..e42623d
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_statistics.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 Memory Allocator: D3D12MA::Statistics 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">Statistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="struct_d3_d12_m_a_1_1_statistics-members.html">List of all members</a>  </div>
+  <div class="headertitle"><div class="title">D3D12MA::Statistics Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total.  
+ <a href="struct_d3_d12_m_a_1_1_statistics.html#details">More...</a></p>
+
+<p><code>#include &lt;D3D12MemAlloc.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a780b0ddd26d8f6b033ddaa3ba436bf65"><td class="memItemLeft" align="right" valign="top">UINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65">BlockCount</a></td></tr>
+<tr class="memdesc:a780b0ddd26d8f6b033ddaa3ba436bf65"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of D3D12 memory blocks allocated - <code>ID3D12Heap</code> objects and committed resources.  <a href="struct_d3_d12_m_a_1_1_statistics.html#a780b0ddd26d8f6b033ddaa3ba436bf65">More...</a><br /></td></tr>
+<tr class="separator:a780b0ddd26d8f6b033ddaa3ba436bf65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef88ac53531db43a8888ad2be4a06c68"><td class="memItemLeft" align="right" valign="top">UINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">AllocationCount</a></td></tr>
+<tr class="memdesc:aef88ac53531db43a8888ad2be4a06c68"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> objects allocated.  <a href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">More...</a><br /></td></tr>
+<tr class="separator:aef88ac53531db43a8888ad2be4a06c68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65557893f80ff116c43965dbd8d45812"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812">BlockBytes</a></td></tr>
+<tr class="memdesc:a65557893f80ff116c43965dbd8d45812"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of bytes allocated in memory blocks.  <a href="struct_d3_d12_m_a_1_1_statistics.html#a65557893f80ff116c43965dbd8d45812">More...</a><br /></td></tr>
+<tr class="separator:a65557893f80ff116c43965dbd8d45812"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53cfe3d241124b5a8e8058871a4b50e8"><td class="memItemLeft" align="right" valign="top">UINT64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">AllocationBytes</a></td></tr>
+<tr class="memdesc:a53cfe3d241124b5a8e8058871a4b50e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes occupied by all <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> objects.  <a href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">More...</a><br /></td></tr>
+<tr class="separator:a53cfe3d241124b5a8e8058871a4b50e8"><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 >Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total. </p>
+<p >These are fast to calculate. See functions: <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a1ac113daec5f6ef28ecb1786cf544144" title="Retrieves information about current memory usage and budget.">D3D12MA::Allocator::GetBudget()</a>, <a class="el" href="class_d3_d12_m_a_1_1_pool.html#aa9d849dc4667314b2a53eddf02f5af91" title="Retrieves basic statistics of the custom pool that are fast to calculate.">D3D12MA::Pool::GetStatistics()</a>. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="a53cfe3d241124b5a8e8058871a4b50e8" name="a53cfe3d241124b5a8e8058871a4b50e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53cfe3d241124b5a8e8058871a4b50e8">&#9670;&nbsp;</a></span>AllocationBytes</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::Statistics::AllocationBytes</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Total number of bytes occupied by all <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> objects. </p>
+<p >Always less or equal than <code>BlockBytes</code>. Difference <code>(BlockBytes - AllocationBytes)</code> is the amount of memory allocated from D3D12 but unused by any <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a>. </p>
+
+</div>
+</div>
+<a id="aef88ac53531db43a8888ad2be4a06c68" name="aef88ac53531db43a8888ad2be4a06c68"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef88ac53531db43a8888ad2be4a06c68">&#9670;&nbsp;</a></span>AllocationCount</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT D3D12MA::Statistics::AllocationCount</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> objects allocated. </p>
+<p >Committed allocations have their own blocks, so each one adds 1 to <code>AllocationCount</code> as well as <code>BlockCount</code>. </p>
+
+</div>
+</div>
+<a id="a65557893f80ff116c43965dbd8d45812" name="a65557893f80ff116c43965dbd8d45812"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65557893f80ff116c43965dbd8d45812">&#9670;&nbsp;</a></span>BlockBytes</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT64 D3D12MA::Statistics::BlockBytes</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of bytes allocated in memory blocks. </p>
+
+</div>
+</div>
+<a id="a780b0ddd26d8f6b033ddaa3ba436bf65" name="a780b0ddd26d8f6b033ddaa3ba436bf65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a780b0ddd26d8f6b033ddaa3ba436bf65">&#9670;&nbsp;</a></span>BlockCount</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">UINT D3D12MA::Statistics::BlockCount</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of D3D12 memory blocks allocated - <code>ID3D12Heap</code> objects and committed resources. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>D:/PROJECTS/D3D12 Memory Allocator/REPO/include/<a class="el" href="_d3_d12_mem_alloc_8h.html">D3D12MemAlloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_total_statistics-members.html b/docs/html/struct_d3_d12_m_a_1_1_total_statistics-members.html
new file mode 100644
index 0000000..b7b03ca
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_total_statistics-members.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle"><div class="title">D3D12MA::TotalStatistics Member List</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5">HeapType</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</a></td><td class="entry"></td></tr>
+  <tr class="odd"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650">MemorySegmentGroup</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6">Total</a></td><td class="entry"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</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="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_d3_d12_m_a_1_1_total_statistics.html b/docs/html/struct_d3_d12_m_a_1_1_total_statistics.html
new file mode 100644
index 0000000..5f45df6
--- /dev/null
+++ b/docs/html/struct_d3_d12_m_a_1_1_total_statistics.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.2"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Direct3D 12 Memory Allocator: D3D12MA::TotalStatistics 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">Direct3D 12 Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.2 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></li><li class="navelem"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">TotalStatistics</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="struct_d3_d12_m_a_1_1_total_statistics-members.html">List of all members</a>  </div>
+  <div class="headertitle"><div class="title">D3D12MA::TotalStatistics Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>General statistics from current state of the allocator - total memory usage across all memory heaps and segments.  
+ <a href="struct_d3_d12_m_a_1_1_total_statistics.html#details">More...</a></p>
+
+<p><code>#include &lt;D3D12MemAlloc.h&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a07247152fc70a8ee5605cab0fe220ea5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5">HeapType</a> [4]</td></tr>
+<tr class="memdesc:a07247152fc70a8ee5605cab0fe220ea5"><td class="mdescLeft">&#160;</td><td class="mdescRight">One element for each type of heap located at the following indices:  <a href="struct_d3_d12_m_a_1_1_total_statistics.html#a07247152fc70a8ee5605cab0fe220ea5">More...</a><br /></td></tr>
+<tr class="separator:a07247152fc70a8ee5605cab0fe220ea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed7d22d5cd773aa896bc4c786c7f3650"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650">MemorySegmentGroup</a> [2]</td></tr>
+<tr class="memdesc:aed7d22d5cd773aa896bc4c786c7f3650"><td class="mdescLeft">&#160;</td><td class="mdescRight">One element for each memory segment group located at the following indices:  <a href="struct_d3_d12_m_a_1_1_total_statistics.html#aed7d22d5cd773aa896bc4c786c7f3650">More...</a><br /></td></tr>
+<tr class="separator:aed7d22d5cd773aa896bc4c786c7f3650"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0bb53579457ddec2872c547ae8922a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6">Total</a></td></tr>
+<tr class="memdesc:ac0bb53579457ddec2872c547ae8922a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total statistics from all memory allocated from D3D12.  <a href="struct_d3_d12_m_a_1_1_total_statistics.html#ac0bb53579457ddec2872c547ae8922a6">More...</a><br /></td></tr>
+<tr class="separator:ac0bb53579457ddec2872c547ae8922a6"><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 >General statistics from current state of the allocator - total memory usage across all memory heaps and segments. </p>
+<p >These are slower to calculate. Use for debugging purposes. See function <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#a99db00df909963573a976c203b107d22" title="Retrieves statistics from current state of the allocator.">D3D12MA::Allocator::CalculateStatistics()</a>. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="a07247152fc70a8ee5605cab0fe220ea5" name="a07247152fc70a8ee5605cab0fe220ea5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a07247152fc70a8ee5605cab0fe220ea5">&#9670;&nbsp;</a></span>HeapType</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> D3D12MA::TotalStatistics::HeapType[4]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>One element for each type of heap located at the following indices: </p>
+<ul>
+<li>0 = <code>D3D12_HEAP_TYPE_DEFAULT</code></li>
+<li>1 = <code>D3D12_HEAP_TYPE_UPLOAD</code></li>
+<li>2 = <code>D3D12_HEAP_TYPE_READBACK</code></li>
+<li>3 = <code>D3D12_HEAP_TYPE_CUSTOM</code> </li>
+</ul>
+
+</div>
+</div>
+<a id="aed7d22d5cd773aa896bc4c786c7f3650" name="aed7d22d5cd773aa896bc4c786c7f3650"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed7d22d5cd773aa896bc4c786c7f3650">&#9670;&nbsp;</a></span>MemorySegmentGroup</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> D3D12MA::TotalStatistics::MemorySegmentGroup[2]</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>One element for each memory segment group located at the following indices: </p>
+<ul>
+<li>0 = <code>DXGI_MEMORY_SEGMENT_GROUP_LOCAL</code></li>
+<li>1 = <code>DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL</code></li>
+</ul>
+<p >Meaning of these segment groups is:</p>
+<ul>
+<li>When <code>IsUMA() == FALSE</code> (discrete graphics card):<ul>
+<li><code>DXGI_MEMORY_SEGMENT_GROUP_LOCAL</code> (index 0) represents GPU memory (resources allocated in <code>D3D12_HEAP_TYPE_DEFAULT</code> or <code>D3D12_MEMORY_POOL_L1</code>).</li>
+<li><code>DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL</code> (index 1) represents system memory (resources allocated in <code>D3D12_HEAP_TYPE_UPLOAD</code>, <code>D3D12_HEAP_TYPE_READBACK</code>, or <code>D3D12_MEMORY_POOL_L0</code>).</li>
+</ul>
+</li>
+<li>When <code>IsUMA() == TRUE</code> (integrated graphics chip):<ul>
+<li><code>DXGI_MEMORY_SEGMENT_GROUP_LOCAL</code> = (index 0) represents memory shared for all the resources.</li>
+<li><code>DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL</code> = (index 1) is unused and always 0. </li>
+</ul>
+</li>
+</ul>
+
+</div>
+</div>
+<a id="ac0bb53579457ddec2872c547ae8922a6" name="ac0bb53579457ddec2872c547ae8922a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0bb53579457ddec2872c547ae8922a6">&#9670;&nbsp;</a></span>Total</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">DetailedStatistics</a> D3D12MA::TotalStatistics::Total</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Total statistics from all memory allocated from D3D12. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>D:/PROJECTS/D3D12 Memory Allocator/REPO/include/<a class="el" href="_d3_d12_mem_alloc_8h.html">D3D12MemAlloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.2
+</small></address>
+</body>
+</html>
diff --git a/docs/html/virtual_allocator.html b/docs/html/virtual_allocator.html
index e677bf2..91052f0 100644
--- a/docs/html/virtual_allocator.html
+++ b/docs/html/virtual_allocator.html
@@ -83,10 +83,10 @@
 <div class="line"> </div>
 <div class="line"><a class="code hl_class" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a> *block;</div>
 <div class="line">HRESULT hr = <a class="code hl_function" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98">CreateVirtualBlock</a>(&amp;blockDesc, &amp;block);</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_virtual_block_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></div><div class="ttdoc">Represents pure allocation algorithm and a data structure with allocations in some memory block,...</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1038</div></div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_virtual_block_html"><div class="ttname"><a href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></div><div class="ttdoc">Represents pure allocation algorithm and a data structure with allocations in some memory block,...</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1115</div></div>
 <div class="ttc" id="anamespace_d3_d12_m_a_html_ab024647ae85ee63e2fa2c1c4beac6d98"><div class="ttname"><a href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98">D3D12MA::CreateVirtualBlock</a></div><div class="ttdeci">D3D12MA_API HRESULT CreateVirtualBlock(const VIRTUAL_BLOCK_DESC *pDesc, VirtualBlock **ppVirtualBlock)</div><div class="ttdoc">Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html">D3D12MA::VIRTUAL_BLOCK_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::VirtualBlock object to be passed to CreateVirtualBlock().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:958</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c_html_ac56491679f276a5a9956ed99bc4654e4"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4">D3D12MA::VIRTUAL_BLOCK_DESC::Size</a></div><div class="ttdeci">UINT64 Size</div><div class="ttdoc">Total size of the block.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:966</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html">D3D12MA::VIRTUAL_BLOCK_DESC</a></div><div class="ttdoc">Parameters of created D3D12MA::VirtualBlock object to be passed to CreateVirtualBlock().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1035</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c_html_ac56491679f276a5a9956ed99bc4654e4"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4">D3D12MA::VIRTUAL_BLOCK_DESC::Size</a></div><div class="ttdeci">UINT64 Size</div><div class="ttdoc">Total size of the block.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1043</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="virtual_allocator_making_virtual_allocations"></a>
 Making virtual allocations</h1>
 <p ><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object contains internal data structure that keeps track of free and occupied regions using the same code as the main D3D12 memory allocator. A single allocation is identified by a lightweight structure <a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" title="Represents single memory allocation done inside VirtualBlock.">D3D12MA::VirtualAllocation</a>. You will also likely want to know the offset at which the allocation was made in the block.</p>
@@ -111,9 +111,9 @@
 <div class="line">    <span class="comment">// Allocation failed - no space for it could be found. Handle this error!</span></div>
 <div class="line">}</div>
 <div class="ttc" id="aclass_d3_d12_m_a_1_1_virtual_block_html_a9281daf76e888ea1bd5247d5732e8179"><div class="ttname"><a href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179">D3D12MA::VirtualBlock::Allocate</a></div><div class="ttdeci">HRESULT Allocate(const VIRTUAL_ALLOCATION_DESC *pDesc, VirtualAllocation *pAllocation, UINT64 *pOffset)</div><div class="ttdoc">Creates new allocation.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created virtual allocation to be passed to VirtualBlock::Allocate().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:989</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_a976b649e45abdd0769da0d79acde4bac"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac">D3D12MA::VIRTUAL_ALLOCATION_DESC::Size</a></div><div class="ttdeci">UINT64 Size</div><div class="ttdoc">Size of the allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:996</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_virtual_allocation_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_virtual_allocation.html">D3D12MA::VirtualAllocation</a></div><div class="ttdoc">Represents single memory allocation done inside VirtualBlock.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:265</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></div><div class="ttdoc">Parameters of created virtual allocation to be passed to VirtualBlock::Allocate().</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1066</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_a976b649e45abdd0769da0d79acde4bac"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#a976b649e45abdd0769da0d79acde4bac">D3D12MA::VIRTUAL_ALLOCATION_DESC::Size</a></div><div class="ttdeci">UINT64 Size</div><div class="ttdoc">Size of the allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1073</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_virtual_allocation_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_virtual_allocation.html">D3D12MA::VirtualAllocation</a></div><div class="ttdoc">Represents single memory allocation done inside VirtualBlock.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:400</div></div>
 </div><!-- fragment --><h1><a class="anchor" id="virtual_allocator_deallocation"></a>
 Deallocation</h1>
 <p >When no longer needed, an allocation can be freed by calling <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#aab44e46bd122054c894fc84740f1e8fb" title="Frees the allocation.">D3D12MA::VirtualBlock::FreeAllocation</a>.</p>
@@ -150,7 +150,7 @@
 <div class="line"><a class="code hl_struct" href="struct_d3_d12_m_a_1_1_virtual_allocation.html">D3D12MA::VirtualAllocation</a> alloc;</div>
 <div class="line">UINT64 allocOffset;</div>
 <div class="line">hr = block-&gt;<a class="code hl_function" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179">Allocate</a>(&amp;allocDesc, &amp;alloc, &amp;allocOffset);</div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aaa95e62f2f399339a09dcbb312a42de0"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aaa95e62f2f399339a09dcbb312a42de0">D3D12MA::VIRTUAL_ALLOCATION_DESC::Alignment</a></div><div class="ttdeci">UINT64 Alignment</div><div class="ttdoc">Required alignment of the allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1001</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c_html_aaa95e62f2f399339a09dcbb312a42de0"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#aaa95e62f2f399339a09dcbb312a42de0">D3D12MA::VIRTUAL_ALLOCATION_DESC::Alignment</a></div><div class="ttdeci">UINT64 Alignment</div><div class="ttdoc">Required alignment of the allocation.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:1078</div></div>
 </div><!-- fragment --><p >Alignments of different allocations made from one block may vary. However, if all alignments and sizes are always multiply of some size e.g. 4 B or <code>sizeof(MyDataStruct)</code>, you can express all sizes, alignments, and offsets in multiples of that size instead of individual bytes. It might be more convenient, but you need to make sure to use this new unit consistently in all the places:</p>
 <ul>
 <li><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#ac56491679f276a5a9956ed99bc4654e4" title="Total size of the block.">D3D12MA::VIRTUAL_BLOCK_DESC::Size</a></li>
@@ -159,16 +159,17 @@
 </ul>
 <h1><a class="anchor" id="virtual_allocator_statistics"></a>
 Statistics</h1>
-<p >You can obtain statistics of a virtual block using <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526" title="Retrieves statistics from the current state of the block.">D3D12MA::VirtualBlock::CalculateStats</a>. The function fills structure <a class="el" href="struct_d3_d12_m_a_1_1_stat_info.html" title="Calculated statistics of memory usage in entire allocator.">D3D12MA::StatInfo</a> - same as used by the normal D3D12 memory allocator. Example:</p>
-<div class="fragment"><div class="line"><a class="code hl_struct" href="struct_d3_d12_m_a_1_1_stat_info.html">D3D12MA::StatInfo</a> statInfo;</div>
-<div class="line">block-&gt;<a class="code hl_function" href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">CalculateStats</a>(&amp;statInfo);</div>
+<p >You can obtain brief statistics of a virtual block using <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110" title="Retrieves basic statistics of the virtual block that are fast to calculate.">D3D12MA::VirtualBlock::GetStatistics()</a>. The function fills structure <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a> - same as used by the normal D3D12 memory allocator. Example:</p>
+<div class="fragment"><div class="line"><a class="code hl_struct" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a> stats;</div>
+<div class="line">block-&gt;<a class="code hl_function" href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">GetStatistics</a>(&amp;stats);</div>
 <div class="line">printf(<span class="stringliteral">&quot;My virtual block has %llu bytes used by %u virtual allocations\n&quot;</span>,</div>
-<div class="line">    statInfo.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7">UsedBytes</a>, statInfo.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e">AllocationCount</a>);</div>
-<div class="ttc" id="aclass_d3_d12_m_a_1_1_virtual_block_html_a039ee8426818d0126cf7f44c1c658526"><div class="ttname"><a href="class_d3_d12_m_a_1_1_virtual_block.html#a039ee8426818d0126cf7f44c1c658526">D3D12MA::VirtualBlock::CalculateStats</a></div><div class="ttdeci">void CalculateStats(StatInfo *pInfo) const</div><div class="ttdoc">Retrieves statistics from the current state of the block.</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_stat_info_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_stat_info.html">D3D12MA::StatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:656</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_stat_info_html_a2f50de812e296b71594174ff67bbac6e"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_stat_info.html#a2f50de812e296b71594174ff67bbac6e">D3D12MA::StatInfo::AllocationCount</a></div><div class="ttdeci">UINT AllocationCount</div><div class="ttdoc">Number of D3D12MA::Allocation objects allocated.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:660</div></div>
-<div class="ttc" id="astruct_d3_d12_m_a_1_1_stat_info_html_ac4f3379ea88025e4ccf5880fab2699f7"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_stat_info.html#ac4f3379ea88025e4ccf5880fab2699f7">D3D12MA::StatInfo::UsedBytes</a></div><div class="ttdeci">UINT64 UsedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:664</div></div>
-</div><!-- fragment --><p >You can also request a full list of allocations and free regions as a string in JSON format by calling <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703" title="Builds and returns statistics as a string in JSON format, including the list of allocations with thei...">D3D12MA::VirtualBlock::BuildStatsString</a>. Returned string must be later freed using <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a6f78ddaa7da194e239089e52093e68a9" title="Frees memory of a string returned from VirtualBlock::BuildStatsString.">D3D12MA::VirtualBlock::FreeStatsString</a>. The format of this string may differ from the one returned by the main D3D12 allocator, but it is similar.</p>
+<div class="line">    stats.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">AllocationBytes</a>, stats.<a class="code hl_variable" href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">AllocationCount</a>);</div>
+<div class="ttc" id="aclass_d3_d12_m_a_1_1_virtual_block_html_a0f1dda0e019e218b021f64987a74b110"><div class="ttname"><a href="class_d3_d12_m_a_1_1_virtual_block.html#a0f1dda0e019e218b021f64987a74b110">D3D12MA::VirtualBlock::GetStatistics</a></div><div class="ttdeci">void GetStatistics(Statistics *pStats) const</div><div class="ttdoc">Retrieves basic statistics of the virtual block that are fast to calculate.</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_statistics_html"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></div><div class="ttdoc">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:280</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_statistics_html_a53cfe3d241124b5a8e8058871a4b50e8"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_statistics.html#a53cfe3d241124b5a8e8058871a4b50e8">D3D12MA::Statistics::AllocationBytes</a></div><div class="ttdeci">UINT64 AllocationBytes</div><div class="ttdoc">Total number of bytes occupied by all D3D12MA::Allocation objects.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:298</div></div>
+<div class="ttc" id="astruct_d3_d12_m_a_1_1_statistics_html_aef88ac53531db43a8888ad2be4a06c68"><div class="ttname"><a href="struct_d3_d12_m_a_1_1_statistics.html#aef88ac53531db43a8888ad2be4a06c68">D3D12MA::Statistics::AllocationCount</a></div><div class="ttdeci">UINT AllocationCount</div><div class="ttdoc">Number of D3D12MA::Allocation objects allocated.</div><div class="ttdef"><b>Definition:</b> D3D12MemAlloc.h:288</div></div>
+</div><!-- fragment --><p >More detailed statistics can be obtained using function <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a614a82247ce6cf29c38895e16eb971d9" title="Retrieves detailed statistics of the virtual block that are slower to calculate.">D3D12MA::VirtualBlock::CalculateStatistics()</a>, but they are slower to calculate.</p>
+<p >You can also request a full list of allocations and free regions as a string in JSON format by calling <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a828a27070bfa762cae796d4c8f2ef703" title="Builds and returns statistics as a string in JSON format, including the list of allocations with thei...">D3D12MA::VirtualBlock::BuildStatsString</a>. Returned string must be later freed using <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a6f78ddaa7da194e239089e52093e68a9" title="Frees memory of a string returned from VirtualBlock::BuildStatsString.">D3D12MA::VirtualBlock::FreeStatsString</a>. The format of this string may differ from the one returned by the main D3D12 allocator, but it is similar.</p>
 <h1><a class="anchor" id="virtual_allocator_additional_considerations"></a>
 Additional considerations</h1>
 <p >Alternative, linear algorithm can be used with virtual allocator - see flag <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d" title="Enables alternative, linear allocation algorithm in this virtual block.">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR</a> and documentation: <a class="el" href="linear_algorithm.html">Linear allocation algorithm</a>.</p>
diff --git a/include/D3D12MemAlloc.h b/include/D3D12MemAlloc.h
index 9bee566..0bf5958 100644
--- a/include/D3D12MemAlloc.h
+++ b/include/D3D12MemAlloc.h
@@ -33,15 +33,15 @@
 

 \section main_table_of_contents Table of contents

 

-- <b>User guide</b>

-    - \subpage quick_start

-        - [Project setup](@ref quick_start_project_setup)

-        - [Creating resources](@ref quick_start_creating_resources)

-        - [Mapping memory](@ref quick_start_mapping_memory)

-    - \subpage custom_pools

-    - \subpage resource_aliasing

-    - \subpage linear_algorithm

-    - \subpage virtual_allocator

+- \subpage quick_start

+    - [Project setup](@ref quick_start_project_setup)

+    - [Creating resources](@ref quick_start_creating_resources)

+    - [Mapping memory](@ref quick_start_mapping_memory)

+- \subpage custom_pools

+- \subpage statistics

+- \subpage resource_aliasing

+- \subpage linear_algorithm

+- \subpage virtual_allocator

 - \subpage configuration

   - [Custom CPU memory allocator](@ref custom_memory_allocator)

   - [Debug margins](@ref debug_margins)

@@ -270,6 +270,131 @@
     Pool* CustomPool;

 };

 

+/** \brief Calculated statistics of memory usage e.g. in a specific memory heap type,

+memory segment group, custom pool, or total.

+

+These are fast to calculate.

+See functions: D3D12MA::Allocator::GetBudget(), D3D12MA::Pool::GetStatistics().

+*/

+struct Statistics

+{

+    /** \brief Number of D3D12 memory blocks allocated - `ID3D12Heap` objects and committed resources.

+    */

+    UINT BlockCount;

+    /** \brief Number of D3D12MA::Allocation objects allocated.

+

+    Committed allocations have their own blocks, so each one adds 1 to `AllocationCount` as well as `BlockCount`.

+    */

+    UINT AllocationCount;

+    /** \brief Number of bytes allocated in memory blocks.

+    */

+    UINT64 BlockBytes;

+    /** \brief Total number of bytes occupied by all D3D12MA::Allocation objects.

+

+    Always less or equal than `BlockBytes`.

+    Difference `(BlockBytes - AllocationBytes)` is the amount of memory allocated from D3D12

+    but unused by any D3D12MA::Allocation.

+    */

+    UINT64 AllocationBytes;

+};

+

+/** \brief More detailed statistics than D3D12MA::Statistics.

+

+These are slower to calculate. Use for debugging purposes.

+See functions: D3D12MA::Allocator::CalculateStatistics(), D3D12MA::Pool::CalculateStatistics().

+

+Averages are not provided because they can be easily calculated as:

+

+\code

+UINT64 AllocationSizeAvg = DetailedStats.Statistics.AllocationBytes / detailedStats.Statistics.AllocationCount;

+UINT64 UnusedBytes = DetailedStats.Statistics.BlockBytes - DetailedStats.Statistics.AllocationBytes;

+UINT64 UnusedRangeSizeAvg = UnusedBytes / DetailedStats.UnusedRangeCount;

+\endcode

+*/

+struct DetailedStatistics

+{

+    /// Basic statistics.

+    Statistics Stats;

+    /// Number of free ranges of memory between allocations.

+    UINT UnusedRangeCount;

+    /// Smallest allocation size. `UINT64_MAX` if there are 0 allocations.

+    UINT64 AllocationSizeMin;

+    /// Largest allocation size. 0 if there are 0 allocations.

+    UINT64 AllocationSizeMax;

+    /// Smallest empty range size. `UINT64_MAX` if there are 0 empty ranges.

+    UINT64 UnusedRangeSizeMin;

+    /// Largest empty range size. 0 if there are 0 empty ranges.

+    UINT64 UnusedRangeSizeMax;

+};

+

+/** \brief  General statistics from current state of the allocator -

+total memory usage across all memory heaps and segments.

+

+These are slower to calculate. Use for debugging purposes.

+See function D3D12MA::Allocator::CalculateStatistics().

+*/

+struct TotalStatistics

+{

+    /** \brief One element for each type of heap located at the following indices:

+

+    - 0 = `D3D12_HEAP_TYPE_DEFAULT`

+    - 1 = `D3D12_HEAP_TYPE_UPLOAD`

+    - 2 = `D3D12_HEAP_TYPE_READBACK`

+    - 3 = `D3D12_HEAP_TYPE_CUSTOM`

+    */

+    DetailedStatistics HeapType[4];

+    /** \brief One element for each memory segment group located at the following indices:

+

+    - 0 = `DXGI_MEMORY_SEGMENT_GROUP_LOCAL`

+    - 1 = `DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL`

+

+    Meaning of these segment groups is:

+

+    - When `IsUMA() == FALSE` (discrete graphics card):

+      - `DXGI_MEMORY_SEGMENT_GROUP_LOCAL` (index 0) represents GPU memory

+      (resources allocated in `D3D12_HEAP_TYPE_DEFAULT` or `D3D12_MEMORY_POOL_L1`).

+      - `DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL` (index 1) represents system memory

+      (resources allocated in `D3D12_HEAP_TYPE_UPLOAD`, `D3D12_HEAP_TYPE_READBACK`, or `D3D12_MEMORY_POOL_L0`).

+    - When `IsUMA() == TRUE` (integrated graphics chip):

+      - `DXGI_MEMORY_SEGMENT_GROUP_LOCAL` = (index 0) represents memory shared for all the resources.

+      - `DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL` = (index 1) is unused and always 0.

+    */

+    DetailedStatistics MemorySegmentGroup[2];

+    /// Total statistics from all memory allocated from D3D12.

+    DetailedStatistics Total;

+};

+

+/** \brief %Statistics of current memory usage and available budget for a specific memory segment group.

+

+These are fast to calculate. See function D3D12MA::Allocator::GetBudget().

+*/

+struct Budget

+{

+    /** \brief %Statistics fetched from the library.

+    */

+    Statistics Stats;

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

+

+    Fetched from system using `IDXGIAdapter3::QueryVideoMemoryInfo` if possible.

+

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

+    also occupying the memory, like swapchain, pipeline state objects, descriptor heaps, command lists, or

+    heaps and resources allocated outside of this library, if any.

+    */

+    UINT64 UsageBytes;

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

+

+    Fetched from system using `IDXGIAdapter3::QueryVideoMemoryInfo` if possible.

+

+    It might be different (most probably smaller) than memory capacity returned

+    by D3D12MA::Allocator::GetMemoryCapacity() due to factors

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

+    Difference `BudgetBytes - UsageBytes` is the amount of additional memory that can probably

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

+    */

+    UINT64 BudgetBytes;

+};

+

 /// \brief Represents single memory allocation done inside VirtualBlock.

 struct D3D12MA_API VirtualAllocation

 {

@@ -552,11 +677,15 @@
     */

     POOL_DESC GetDesc() const;

 

-    /** \brief TODO

+    /** \brief Retrieves basic statistics of the custom pool that are fast to calculate.

+

+    \param[out] pStats %Statistics of the current pool.

     */

     void GetStatistics(Statistics* pStats);

 

-    /** \brief TODO

+    /** \brief Retrieves detailed statistics of the custom pool that are slower to calculate.

+

+    \param[out] pStats %Statistics of the current pool.

     */

     void CalculateStatistics(DetailedStatistics* pStats);

 

@@ -651,71 +780,6 @@
 */

 const UINT HEAP_TYPE_COUNT = 4;

 

-/** \brief TODO

-*/

-struct Statistics

-{

-    /// Number of memory blocks (heaps) allocated.

-    UINT BlockCount;

-    /// Number of D3D12MA::Allocation objects allocated.

-    UINT AllocationCount;

-    UINT64 BlockBytes;

-    /// Total number of bytes occupied by all allocations.

-    UINT64 AllocationBytes;

-};

-

-struct DetailedStatistics

-{

-    Statistics Stats;

-    UINT UnusedRangeCount;

-    UINT64 AllocationSizeMin;

-    UINT64 AllocationSizeMax;

-    UINT64 UnusedRangeSizeMin;

-    UINT64 UnusedRangeSizeMax;

-};

-

-/**

-\brief General statistics from the current state of the allocator.

-*/

-struct TotalStatistics

-{

-    /** \brief

-    One element for each type of heap located at the following indices:

-    0 - DEFAULT, 1 - UPLOAD, 2 - READBACK, 3 - CUSTOM.

-    */

-    DetailedStatistics HeapType[HEAP_TYPE_COUNT];

-    /// Total statistics from all heap types.

-    DetailedStatistics Total;

-};

-

-/** \brief Statistics of current memory usage and available budget, in bytes, for GPU or CPU memory.

-*/

-struct Budget

-{

-    /** \brief TODO

-    */

-    Statistics Stats;

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

-

-    Fetched from system using `IDXGIAdapter3::QueryVideoMemoryInfo` if enabled.

-

-    It might be different than `BlockBytes` (usually higher) due to additional implicit objects

-    also occupying the memory, like swapchain, pipeline state objects, descriptor heaps, command lists, or

-    memory blocks allocated outside of this library, if any.

-    */

-    UINT64 UsageBytes;

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

-

-    Fetched from system using `IDXGIAdapter3::QueryVideoMemoryInfo` if enabled.

-

-    It might be different (most probably smaller) than memory sizes reported in `DXGI_ADAPTER_DESC` due to factors

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

-    Difference `BudgetBytes - UsageBytes` is the amount of additional memory that can probably

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

-    */

-    UINT64 BudgetBytes;

-};

-

 /**

 \brief Represents main object of this library initialized for particular `ID3D12Device`.

 

@@ -746,6 +810,23 @@
     - https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-getcustomheapproperties

     */

     BOOL IsCacheCoherentUMA() const;

+    /** \brief Returns total amount of memory of specific segment group, in bytes.

+    

+    \param memorySegmentGroup use `DXGI_MEMORY_SEGMENT_GROUP_LOCAL` or DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL`.

+

+    This information is taken from `DXGI_ADAPTER_DESC`.

+    It is not recommended to use this number.

+    You should preferably call GetBudget() and limit memory usage to D3D12MA::Budget::BudgetBytes instead.

+

+    - When IsUMA() `== FALSE` (discrete graphics card):

+      - `GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_LOCAL)` returns the size of the video memory.

+      - `GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)` returns the size of the system memory available for D3D12 resources.

+    - When IsUMA() `== TRUE` (integrated graphics chip):

+      - `GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_LOCAL)` returns the size of the shared memory available for all D3D12 resources.

+        All memory is considered "local".

+      - `GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL)` is not applicable and returns 0.

+    */

+    UINT64 GetMemoryCapacity(UINT memorySegmentGroup) const;

 

     /** \brief Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation function.

 

@@ -868,22 +949,38 @@
     */

     void SetCurrentFrameIndex(UINT frameIndex);

 

-    /** \brief TODO

-    */

-    void CalculateStatistics(TotalStatistics* pStats);

+    /** \brief Retrieves information about current memory usage and budget.

 

-    /** \brief Retrieves information about current memory budget.

+    \param[out] pLocalBudget Optional, can be null.

+    \param[out] pNonLocalBudget Optional, can be null.

 

-    \param[out] pGpuBudget Optional, can be null.

-    \param[out] pCpuBudget Optional, can be null.

+    - When IsUMA() `== FALSE` (discrete graphics card):

+      - `pLocalBudget` returns the budget of the video memory.

+      - `pNonLocalBudget` returns the budget of the system memory available for D3D12 resources.

+    - When IsUMA() `== TRUE` (integrated graphics chip):

+      - `pLocalBudget` returns the budget of the shared memory available for all D3D12 resources.

+        All memory is considered "local".

+      - `pNonLocalBudget` is not applicable and returns zeros.

 

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

-    every frame or every allocation. For more detailed statistics use CalculateStats().

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

 

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

     become outdated.

     */

-    void GetBudget(Budget* pGpuBudget, Budget* pCpuBudget);

+    void GetBudget(Budget* pLocalBudget, Budget* pNonLocalBudget);

+

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

+

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

+    internal data structures, so it may be quite slow. Use it for debugging purposes.

+    For faster but more brief statistics suitable to be called every frame or every allocation,

+    use GetBudget().

+

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

+    become outdated.

+    */

+    void CalculateStatistics(TotalStatistics* pStats);

 

     /// Builds and returns statistics as a string in JSON format.

     /** @param[out] ppStatsString Must be freed using Allocator::FreeStatsString.

@@ -1044,11 +1141,14 @@
     /** \brief Changes custom pointer for an allocation to a new value.

     */

     void SetAllocationUserData(VirtualAllocation allocation, void* pUserData);

+    /** \brief Retrieves basic statistics of the virtual block that are fast to calculate.

 

-    /** \brief TODO

+    \param[out] pStats %Statistics of the virtual block.

     */

     void GetStatistics(Statistics* pStats) const;

-    /** \brief TODO

+    /** \brief Retrieves detailed statistics of the virtual block that are slower to calculate.

+

+    \param[out] pStats %Statistics of the virtual block.

     */

     void CalculateStatistics(DetailedStatistics* pStats) const;

 

@@ -1334,7 +1434,7 @@
 more opportunities for internal optimizations, custom pools may be useful in following cases:

 

 - To keep some resources separate from others in memory.

-- To keep track of memory usage of just a specific group of resources. Statistics can be queried using

+- To keep track of memory usage of just a specific group of resources. %Statistics can be queried using

   D3D12MA::Pool::CalculateStats.

 - To use specific size of a memory block (`ID3D12Heap`). To set it, use member D3D12MA::POOL_DESC::BlockSize.

   When set to 0, the library uses automatically determined, variable block sizes.

@@ -1368,6 +1468,64 @@
 extended allocation parameters, like custom `D3D12_HEAP_PROPERTIES`, which are available only in custom pools.

 

 

+\page statistics Statistics

+

+This library contains several functions that return information about its internal state,

+especially the amount of memory allocated from D3D12.

+

+\section statistics_numeric_statistics Numeric statistics

+

+If you need to obtain basic statistics about memory usage per memory segment group, together with current budget,

+you can call function D3D12MA::Allocator::GetBudget() and inspect structure D3D12MA::Budget.

+This is useful to keep track of memory usage and stay withing budget.

+Example:

+

+\code

+D3D12MA::Budget localBudget;

+allocator->GetBudget(&localBudget, NULL);

+

+printf("My GPU memory currently has %u allocations taking %llu B,\n",

+    localBudget.Statistics.AllocationCount,

+    localBudget.Statistics.AllocationBytes);

+printf("allocated out of %u D3D12 memory heaps taking %llu B,\n",

+    localBudget.Statistics.BlockCount,

+    localBudget.Statistics.BlockBytes);

+printf("D3D12 reports total usage %llu B with budget %llu B.\n",

+    localBudget.UsageBytes,

+    localBudget.BudgetBytes);

+\endcode

+

+You can query for more detailed statistics per heap type, memory segment group, and totals,

+including minimum and maximum allocation size and unused range size,

+by calling function D3D12MA::Allocator::CalculateStatistics() and inspecting structure D3D12MA::TotalStatistics.

+This function is slower though, as it has to traverse all the internal data structures,

+so it should be used only for debugging purposes.

+

+You can query for statistics of a custom pool using function D3D12MA::Pool::GetStatistics()

+or D3D12MA::Pool::CalculateStatistics().

+

+You can query for information about a specific allocation using functions of the D3D12MA::Allocation class,

+e.g. `GetSize()`, `GetOffset()`, `GetHeap()`.

+

+\section statistics_json_dump JSON dump

+

+You can dump internal state of the allocator to a string in JSON format using function D3D12MA::Allocator::BuildStatsString().

+The result is guaranteed to be correct JSON.

+It uses Windows Unicode (UTF-16) encoding.

+Any strings provided by user (see D3D12MA::Allocation::SetName())

+are copied as-is and properly escaped for JSON.

+It must be freed using function D3D12MA::Allocator::FreeStatsString().

+

+The format of this JSON string is not part of official documentation of the library,

+but it will not change in backward-incompatible way without increasing library major version number

+and appropriate mention in changelog.

+

+The JSON string contains all the data that can be obtained using D3D12MA::Allocator::CalculateStatistics().

+It can also contain detailed map of allocated memory blocks and their regions -

+free and occupied by allocations.

+This allows e.g. to visualize the memory or assess fragmentation.

+

+

 \page resource_aliasing Resource aliasing (overlap)

 

 New explicit graphics APIs (Vulkan and Direct3D 12), thanks to manual memory

@@ -1699,17 +1857,20 @@
 

 \section virtual_allocator_statistics Statistics

 

-You can obtain statistics of a virtual block using D3D12MA::VirtualBlock::CalculateStats.

-The function fills structure D3D12MA::StatInfo - same as used by the normal D3D12 memory allocator.

+You can obtain brief statistics of a virtual block using D3D12MA::VirtualBlock::GetStatistics().

+The function fills structure D3D12MA::Statistics - same as used by the normal D3D12 memory allocator.

 Example:

 

 \code

-D3D12MA::StatInfo statInfo;

-block->CalculateStats(&statInfo);

+D3D12MA::Statistics stats;

+block->GetStatistics(&stats);

 printf("My virtual block has %llu bytes used by %u virtual allocations\n",

-    statInfo.UsedBytes, statInfo.AllocationCount);

+    stats.AllocationBytes, stats.AllocationCount);

 \endcode

 

+More detailed statistics can be obtained using function D3D12MA::VirtualBlock::CalculateStatistics(),

+but they are slower to calculate.

+

 You can also request a full list of allocations and free regions as a string in JSON format by calling

 D3D12MA::VirtualBlock::BuildStatsString.

 Returned string must be later freed using D3D12MA::VirtualBlock::FreeStatsString.

diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 3c85d6b..034408d 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -484,6 +484,14 @@
 // Minimum size of a free suballocation to register it in the free suballocation collection.

 static const UINT64 MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;

 

+// Local copy of this enum, as it is provided only by <dxgi1_4.h>, so it may not be available.

+enum DXGI_MEMORY_SEGMENT_GROUP_COPY

+{

+    DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY = 0,

+    DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY = 1,

+    DXGI_MEMORY_SEGMENT_GROUP_COUNT

+};

+

 /*

 Performs binary search and returns iterator to first element that is greater or

 equal to `key`, according to comparison `cmp`.

@@ -545,6 +553,13 @@
     }

 }

 

+static D3D12_HEAP_TYPE IndexToHeapType(UINT heapTypeIndex)

+{

+    D3D12MA_ASSERT(heapTypeIndex < 4);

+    // D3D12_HEAP_TYPE_DEFAULT starts at 1.

+    return (D3D12_HEAP_TYPE)(heapTypeIndex + 1);

+}

+

 static const WCHAR* const HeapTypeNames[] = {

     L"DEFAULT",

     L"UPLOAD",

@@ -3171,6 +3186,8 @@
     ~CommittedAllocationList();

 

     D3D12_HEAP_TYPE GetHeapType() const { return m_HeapType; }

+    PoolPimpl* GetPool() const { return m_Pool; }

+    UINT GetMemorySegmentGroup(AllocatorPimpl* allocator) const;

     

     void AddStatistics(Statistics& inoutStats);

     void AddDetailedStatistics(DetailedStatistics& inoutStats);

@@ -3313,64 +3330,70 @@
 ////////////////////////////////////////////////////////////////////////////////

 // Private class AllocatorPimpl definition

 

-static const UINT STANDARD_HEAP_TYPE_COUNT = 3; // Only DEFAULT, UPLOAD, READBACK.

-static const UINT DEFAULT_POOL_MAX_COUNT = 9;

+static constexpr UINT STANDARD_HEAP_TYPE_COUNT = 3; // Only DEFAULT, UPLOAD, READBACK.

+static constexpr UINT DEFAULT_POOL_MAX_COUNT = 9;

 

-struct CurrentBudgetData

+class CurrentBudgetData

 {

-    D3D12MA_ATOMIC_UINT32 m_BlockCount[HEAP_TYPE_COUNT];

-    D3D12MA_ATOMIC_UINT32 m_AllocationCount[HEAP_TYPE_COUNT];

-    D3D12MA_ATOMIC_UINT64 m_BlockBytes[HEAP_TYPE_COUNT];

-    D3D12MA_ATOMIC_UINT64 m_AllocationBytes[HEAP_TYPE_COUNT];

+public:

+    void GetStatistics(Statistics& outStats, UINT group) const

+    {

+        outStats.BlockCount = m_BlockCount[group];

+        outStats.AllocationCount = m_AllocationCount[group];

+        outStats.BlockBytes = m_BlockBytes[group];

+        outStats.AllocationBytes = m_AllocationBytes[group];

+    }

+    void GetBudget(bool useMutex,

+        UINT64* outLocalUsage, UINT64* outLocalBudget,

+        UINT64* outNonLocalUsage, UINT64* outNonLocalBudget);

 

-    D3D12MA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch;

+    void AddAllocation(UINT group, UINT64 allocationBytes)

+    {

+        ++m_AllocationCount[group];

+        m_AllocationBytes[group] += allocationBytes;

+        ++m_OperationsSinceBudgetFetch;

+    }

+    void RemoveAllocation(UINT group, UINT64 allocationBytes)

+    {

+        D3D12MA_ASSERT(m_AllocationBytes[group] >= allocationBytes);

+        D3D12MA_ASSERT(m_AllocationCount[group] > 0);

+        m_AllocationBytes[group] -= allocationBytes;

+        --m_AllocationCount[group];

+        ++m_OperationsSinceBudgetFetch;

+    }

+    void AddBlock(UINT group, UINT64 blockBytes)

+    {

+        ++m_BlockCount[group];

+        m_BlockBytes[group] += blockBytes;

+        ++m_OperationsSinceBudgetFetch;

+    }

+    void RemoveBlock(UINT group, UINT64 blockBytes)

+    {

+        D3D12MA_ASSERT(m_BlockBytes[group] >= blockBytes);

+        D3D12MA_ASSERT(m_BlockCount[group] > 0);

+        m_BlockBytes[group] -= blockBytes;

+        --m_BlockCount[group];

+        ++m_OperationsSinceBudgetFetch;

+    }

+    bool ShouldUpdateBudget() const

+    {

+        return m_OperationsSinceBudgetFetch >= 30;

+    }

+#if D3D12MA_DXGI_1_4

+    HRESULT UpdateBudget(IDXGIAdapter3* adapter3, bool useMutex);

+#endif

+

+private:

+    D3D12MA_ATOMIC_UINT32 m_BlockCount[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+    D3D12MA_ATOMIC_UINT32 m_AllocationCount[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+    D3D12MA_ATOMIC_UINT64 m_BlockBytes[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+    D3D12MA_ATOMIC_UINT64 m_AllocationBytes[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+

+    D3D12MA_ATOMIC_UINT32 m_OperationsSinceBudgetFetch = 0;

     D3D12MA_RW_MUTEX m_BudgetMutex;

-    UINT64 m_D3D12UsageLocal, m_D3D12UsageNonLocal;

-    UINT64 m_D3D12BudgetLocal, m_D3D12BudgetNonLocal;

-    UINT64 m_BlockBytesAtBudgetFetch[HEAP_TYPE_COUNT];

-

-    CurrentBudgetData()

-    {

-        for(UINT i = 0; i < HEAP_TYPE_COUNT; ++i)

-        {

-            m_BlockCount[i] = 0;

-            m_AllocationCount[i] = 0;

-            m_BlockBytes[i] = 0;

-            m_AllocationBytes[i] = 0;

-            m_BlockBytesAtBudgetFetch[i] = 0;

-        }

-

-        m_D3D12UsageLocal = 0;

-        m_D3D12UsageNonLocal = 0;

-        m_D3D12BudgetLocal = 0;

-        m_D3D12BudgetNonLocal = 0;

-        m_OperationsSinceBudgetFetch = 0;

-    }

-

-    void AddAllocation(UINT heapTypeIndex, UINT64 allocationSize)

-    {

-        ++m_AllocationCount[heapTypeIndex];

-        m_AllocationBytes[heapTypeIndex] += allocationSize;

-        ++m_OperationsSinceBudgetFetch;

-    }

-    void RemoveAllocation(UINT heapTypeIndex, UINT64 allocationSize)

-    {

-        m_AllocationBytes[heapTypeIndex] -= allocationSize;

-        --m_AllocationCount[heapTypeIndex];

-        ++m_OperationsSinceBudgetFetch;

-    }

-    void AddCommittedAllocation(UINT heapTypeIndex, UINT64 allocationSize)

-    {

-        AddAllocation(heapTypeIndex, allocationSize);

-        ++m_BlockCount[heapTypeIndex];

-        m_BlockBytes[heapTypeIndex] += allocationSize;

-    }

-    void RemoveCommittedAllocation(UINT heapTypeIndex, UINT64 allocationSize)

-    {

-        m_BlockBytes[heapTypeIndex] -= allocationSize;

-        --m_BlockCount[heapTypeIndex];

-        RemoveAllocation(heapTypeIndex, allocationSize);

-    }

+    UINT64 m_D3D12Usage[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+    UINT64 m_D3D12Budget[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

+    UINT64 m_BlockBytesAtD3D12Fetch[DXGI_MEMORY_SEGMENT_GROUP_COUNT] = {};

 };

 

 class PoolPimpl

@@ -3454,6 +3477,9 @@
     bool UseMutex() const { return m_UseMutex; }

     AllocationObjectAllocator& GetAllocationObjectAllocator() { return m_AllocationObjectAllocator; }

     bool HeapFlagsFulfillResourceHeapTier(D3D12_HEAP_FLAGS flags) const;

+    UINT StandardHeapTypeToMemorySegmentGroup(D3D12_HEAP_TYPE heapType) const;

+    UINT HeapPropertiesToMemorySegmentGroup(const D3D12_HEAP_PROPERTIES& heapProps) const;

+    UINT64 GetMemoryCapacity(UINT memorySegmentGroup) const;

 

     HRESULT CreateResource(

         const ALLOCATION_DESC* pAllocDesc,

@@ -3505,7 +3531,7 @@
 

     void CalculateStatistics(TotalStatistics& outStats);

 

-    void GetBudget(Budget* outGpuBudget, Budget* outCpuBudget);

+    void GetBudget(Budget* outLocalBudget, Budget* outNonLocalBudget);

     void GetBudgetForHeapType(Budget& outBudget, D3D12_HEAP_TYPE heapType);

 

     void BuildStatsString(WCHAR** ppStatsString, BOOL DetailedMap);

@@ -6074,8 +6100,9 @@
 {

     if(m_Heap)

     {

-        m_Allocator->m_Budget.m_BlockBytes[HeapTypeToIndex(m_HeapProps.Type)] -= m_Size;

         m_Heap->Release();

+        m_Allocator->m_Budget.RemoveBlock(

+            m_Allocator->HeapPropertiesToMemorySegmentGroup(m_HeapProps), m_Size);

     }

 }

 

@@ -6105,7 +6132,8 @@
     

     if(SUCCEEDED(hr))

     {

-        m_Allocator->m_Budget.m_BlockBytes[HeapTypeToIndex(m_HeapProps.Type)] += m_Size;

+        m_Allocator->m_Budget.AddBlock(

+            m_Allocator->HeapPropertiesToMemorySegmentGroup(m_HeapProps), m_Size);

     }

     return hr;

 }

@@ -6132,6 +6160,14 @@
     }

 }

 

+UINT CommittedAllocationList::GetMemorySegmentGroup(AllocatorPimpl* allocator) const

+{

+    if(m_Pool)

+        return allocator->HeapPropertiesToMemorySegmentGroup(m_Pool->GetDesc().HeapProperties);

+    else

+        return allocator->StandardHeapTypeToMemorySegmentGroup(m_HeapType);

+}

+

 void CommittedAllocationList::AddStatistics(Statistics& inoutStats)

 {

     MutexLockRead lock(m_Mutex, m_UseMutex);

@@ -6645,7 +6681,7 @@
         pBlock->m_pMetadata->Alloc(currRequest, size, *pAllocation);

         (*pAllocation)->InitPlaced(currRequest.allocHandle, alignment, pBlock);

         D3D12MA_HEAVY_ASSERT(pBlock->Validate());

-        m_hAllocator->m_Budget.AddAllocation(HeapTypeToIndex(m_HeapProps.Type), size);

+        m_hAllocator->m_Budget.AddAllocation(m_hAllocator->HeapPropertiesToMemorySegmentGroup(m_HeapProps), size);

         return S_OK;

     }

     return E_OUTOFMEMORY;

@@ -6807,6 +6843,72 @@
 }

 

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

+// Private class CurrentBudgetData implementation

+

+void CurrentBudgetData::GetBudget(bool useMutex,

+    UINT64* outLocalUsage, UINT64* outLocalBudget,

+    UINT64* outNonLocalUsage, UINT64* outNonLocalBudget)

+{

+    MutexLockRead lockRead(m_BudgetMutex, useMutex);

+

+    if(outLocalUsage)

+    {

+        const UINT64 D3D12Usage = m_D3D12Usage[DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY];

+        const UINT64 blockBytes = m_BlockBytes[DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY];

+        const UINT64 blockBytesAtD3D12Fetch = m_BlockBytesAtD3D12Fetch[DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY];

+        *outLocalUsage = D3D12Usage + blockBytes > blockBytesAtD3D12Fetch ?

+            D3D12Usage + blockBytes - blockBytesAtD3D12Fetch : 0;

+    }

+    if(outLocalBudget)

+        *outLocalBudget = m_D3D12Budget[DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY];

+

+    if(outNonLocalUsage)

+    {

+        const UINT64 D3D12Usage = m_D3D12Usage[DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY];

+        const UINT64 blockBytes = m_BlockBytes[DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY];

+        const UINT64 blockBytesAtD3D12Fetch = m_BlockBytesAtD3D12Fetch[DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY];

+        *outNonLocalUsage = D3D12Usage + blockBytes > blockBytesAtD3D12Fetch ?

+            D3D12Usage + blockBytes - blockBytesAtD3D12Fetch : 0;

+    }

+    if(outNonLocalBudget)

+        *outNonLocalBudget = m_D3D12Budget[DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY];

+}

+

+#if D3D12MA_DXGI_1_4

+HRESULT CurrentBudgetData::UpdateBudget(IDXGIAdapter3* adapter3, bool useMutex)

+{

+    D3D12MA_ASSERT(adapter3);

+

+    DXGI_QUERY_VIDEO_MEMORY_INFO infoLocal = {};

+    DXGI_QUERY_VIDEO_MEMORY_INFO infoNonLocal = {};

+    const HRESULT hrLocal = adapter3->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &infoLocal);

+    const HRESULT hrNonLocal = adapter3->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &infoNonLocal);

+

+    if(SUCCEEDED(hrLocal) || SUCCEEDED(hrNonLocal))

+    {

+        MutexLockWrite lockWrite(m_BudgetMutex, useMutex);

+

+        if(SUCCEEDED(hrLocal))

+        {

+            m_D3D12Usage[0] = infoLocal.CurrentUsage;

+            m_D3D12Budget[0] = infoLocal.Budget;

+        }

+        if(SUCCEEDED(hrNonLocal))

+        {

+            m_D3D12Usage[1] = infoNonLocal.CurrentUsage;

+            m_D3D12Budget[1] = infoNonLocal.Budget;

+        }

+

+        m_BlockBytesAtD3D12Fetch[0] = m_BlockBytes[0];

+        m_BlockBytesAtD3D12Fetch[1] = m_BlockBytes[1];

+        m_OperationsSinceBudgetFetch = 0;

+    }

+

+    return FAILED(hrLocal) ? hrLocal : hrNonLocal;

+}

+#endif // #if D3D12MA_DXGI_1_4

+

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

 // Public class Pool implementation

 

 void Pool::ReleaseThis()

@@ -6951,10 +7053,7 @@
     }

 

 #if D3D12MA_DXGI_1_4

-    if(m_Adapter3)

-    {

-        UpdateD3D12Budget();

-    }

+    UpdateD3D12Budget();

 #endif

 

     return S_OK;

@@ -7289,8 +7388,9 @@
 

             committedAllocParams.m_List->Register(alloc);

 

-            const UINT heapTypeIndex = HeapTypeToIndex(committedAllocParams.m_HeapProperties.Type);

-            m_Budget.AddCommittedAllocation(heapTypeIndex, resourceSize);

+            const UINT memSegmentGroup = HeapPropertiesToMemorySegmentGroup(committedAllocParams.m_HeapProperties);

+            m_Budget.AddBlock(memSegmentGroup, resourceSize);

+            m_Budget.AddAllocation(memSegmentGroup, resourceSize);

         }

         else

         {

@@ -7344,8 +7444,9 @@
 

             committedAllocParams.m_List->Register(alloc);

 

-            const UINT heapTypeIndex = HeapTypeToIndex(committedAllocParams.m_HeapProperties.Type);

-            m_Budget.AddCommittedAllocation(heapTypeIndex, resourceSize);

+            const UINT memSegmentGroup = HeapPropertiesToMemorySegmentGroup(committedAllocParams.m_HeapProperties);

+            m_Budget.AddBlock(memSegmentGroup, resourceSize);

+            m_Budget.AddAllocation(memSegmentGroup, resourceSize);

         }

         else

         {

@@ -7398,8 +7499,9 @@
         (*ppAllocation)->InitHeap(committedAllocParams.m_List, heap);

         committedAllocParams.m_List->Register(*ppAllocation);

 

-        const UINT heapTypeIndex = HeapTypeToIndex(committedAllocParams.m_HeapProperties.Type);

-        m_Budget.AddCommittedAllocation(heapTypeIndex, allocInfo.SizeInBytes);

+        const UINT memSegmentGroup = HeapPropertiesToMemorySegmentGroup(committedAllocParams.m_HeapProperties);

+        m_Budget.AddBlock(memSegmentGroup, allocInfo.SizeInBytes);

+        m_Budget.AddAllocation(memSegmentGroup, allocInfo.SizeInBytes);

     }

     return hr;

 }

@@ -7587,9 +7689,10 @@
     CommittedAllocationList* const allocList = allocation->m_Committed.list;

     allocList->Unregister(allocation);

 

-    const UINT64 allocationSize = allocation->GetSize();

-    const UINT heapTypeIndex = HeapTypeToIndex(allocList->GetHeapType());

-    m_Budget.RemoveCommittedAllocation(heapTypeIndex, allocationSize);

+    const UINT memSegmentGroup = allocList->GetMemorySegmentGroup(this);

+    const UINT64 allocSize = allocation->GetSize();

+    m_Budget.RemoveAllocation(memSegmentGroup, allocSize);

+    m_Budget.RemoveBlock(memSegmentGroup, allocSize);

 }

 

 void AllocatorPimpl::FreePlacedMemory(Allocation* allocation)

@@ -7600,7 +7703,7 @@
     D3D12MA_ASSERT(block);

     BlockVector* const blockVector = block->GetBlockVector();

     D3D12MA_ASSERT(blockVector);

-    m_Budget.RemoveAllocation(HeapTypeToIndex(block->GetHeapProperties().Type), allocation->GetSize());

+    m_Budget.RemoveAllocation(HeapPropertiesToMemorySegmentGroup(block->GetHeapProperties()), allocation->GetSize());

     blockVector->Free(allocation);

 }

 

@@ -7612,9 +7715,10 @@
     allocList->Unregister(allocation);

     SAFE_RELEASE(allocation->m_Heap.heap);

 

-    const UINT heapTypeIndex = HeapTypeToIndex(allocList->GetHeapType());

-    const UINT64 allocationSize = allocation->GetSize();

-    m_Budget.RemoveCommittedAllocation(heapTypeIndex, allocationSize);

+    const UINT memSegmentGroup = allocList->GetMemorySegmentGroup(this);

+    const UINT64 allocSize = allocation->GetSize();

+    m_Budget.RemoveAllocation(memSegmentGroup, allocSize);

+    m_Budget.RemoveBlock(memSegmentGroup, allocSize);

 }

 

 void AllocatorPimpl::SetCurrentFrameIndex(UINT frameIndex)

@@ -7622,23 +7726,23 @@
     m_CurrentFrameIndex.store(frameIndex);

 

 #if D3D12MA_DXGI_1_4

-    if(m_Adapter3)

-    {

-        UpdateD3D12Budget();

-    }

+    UpdateD3D12Budget();

 #endif

 }

 

 void AllocatorPimpl::CalculateStatistics(TotalStatistics& outStats)

 {

     // Init stats

-    ClearDetailedStatistics(outStats.Total);

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

         ClearDetailedStatistics(outStats.HeapType[i]);

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

+        ClearDetailedStatistics(outStats.MemorySegmentGroup[i]);

+    ClearDetailedStatistics(outStats.Total);

 

-    // Process default pools.

+    // Process default pools. 3 standard heap types only. Add them to outStats.HeapType[i].

     if(SupportsResourceHeapTier2())

     {

+        // DEFAULT, UPLOAD, READBACK.

         for(size_t heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)

         {

             BlockVector* const pBlockVector = m_BlockVectors[heapTypeIndex];

@@ -7648,6 +7752,7 @@
     }

     else

     {

+        // DEFAULT, UPLOAD, READBACK.

         for(size_t heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)

         {

             for(size_t heapSubType = 0; heapSubType < 3; ++heapSubType)

@@ -7659,101 +7764,114 @@
         }

     }

 

-    // Process custom pools

+    // Sum them up to memory segment groups.

+    AddDetailedStatistics(

+        outStats.MemorySegmentGroup[StandardHeapTypeToMemorySegmentGroup(D3D12_HEAP_TYPE_DEFAULT)],

+        outStats.HeapType[0]);

+    AddDetailedStatistics(

+        outStats.MemorySegmentGroup[StandardHeapTypeToMemorySegmentGroup(D3D12_HEAP_TYPE_UPLOAD)],

+        outStats.HeapType[1]);

+    AddDetailedStatistics(

+        outStats.MemorySegmentGroup[StandardHeapTypeToMemorySegmentGroup(D3D12_HEAP_TYPE_READBACK)],

+        outStats.HeapType[2]);

+

+    // Process custom pools.

+    DetailedStatistics tmpStats;

     for(size_t heapTypeIndex = 0; heapTypeIndex < HEAP_TYPE_COUNT; ++heapTypeIndex)

     {

         MutexLockRead lock(m_PoolsMutex[heapTypeIndex], m_UseMutex);

         PoolList& poolList = m_Pools[heapTypeIndex];

         for(PoolPimpl* pool = poolList.Front(); pool != NULL; pool = poolList.GetNext(pool))

         {

-            pool->AddDetailedStatistics(outStats.HeapType[heapTypeIndex]);

+            const D3D12_HEAP_PROPERTIES& poolHeapProps = pool->GetDesc().HeapProperties;

+            ClearDetailedStatistics(tmpStats);

+            pool->AddDetailedStatistics(tmpStats);

+            AddDetailedStatistics(

+                outStats.HeapType[heapTypeIndex], tmpStats);

+            AddDetailedStatistics(

+                outStats.MemorySegmentGroup[HeapPropertiesToMemorySegmentGroup(poolHeapProps)], tmpStats);

         }

     }

 

-    // Process committed allocations.

-    for(size_t heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)

-        m_CommittedAllocations[heapTypeIndex].AddDetailedStatistics(outStats.HeapType[heapTypeIndex]);

+    // Process committed allocations. 3 standard heap types only.

+    for(UINT heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)

+    {

+        ClearDetailedStatistics(tmpStats);

+        m_CommittedAllocations[heapTypeIndex].AddDetailedStatistics(tmpStats);

+        AddDetailedStatistics(

+            outStats.HeapType[heapTypeIndex], tmpStats);

+        AddDetailedStatistics(

+            outStats.MemorySegmentGroup[StandardHeapTypeToMemorySegmentGroup(IndexToHeapType(heapTypeIndex))], tmpStats);

+    }

 

-    // Postprocess

-    for(size_t i = 0; i < HEAP_TYPE_COUNT; ++i)

-        AddDetailedStatistics(outStats.Total, outStats.HeapType[i]);

+    // Sum up memory segment groups to totals.

+    AddDetailedStatistics(outStats.Total, outStats.MemorySegmentGroup[0]);

+    AddDetailedStatistics(outStats.Total, outStats.MemorySegmentGroup[1]);

+

+    D3D12MA_ASSERT(outStats.Total.Stats.BlockCount =

+        outStats.MemorySegmentGroup[0].Stats.BlockCount + outStats.MemorySegmentGroup[1].Stats.BlockCount);

+    D3D12MA_ASSERT(outStats.Total.Stats.AllocationCount =

+        outStats.MemorySegmentGroup[0].Stats.AllocationCount + outStats.MemorySegmentGroup[1].Stats.AllocationCount);

+    D3D12MA_ASSERT(outStats.Total.Stats.BlockBytes =

+        outStats.MemorySegmentGroup[0].Stats.BlockBytes + outStats.MemorySegmentGroup[1].Stats.BlockBytes);

+    D3D12MA_ASSERT(outStats.Total.Stats.AllocationBytes =

+        outStats.MemorySegmentGroup[0].Stats.AllocationBytes + outStats.MemorySegmentGroup[1].Stats.AllocationBytes);

+    D3D12MA_ASSERT(outStats.Total.UnusedRangeCount =

+        outStats.MemorySegmentGroup[0].UnusedRangeCount + outStats.MemorySegmentGroup[1].UnusedRangeCount);

+

+    D3D12MA_ASSERT(outStats.Total.Stats.BlockCount =

+        outStats.HeapType[0].Stats.BlockCount + outStats.HeapType[1].Stats.BlockCount +

+        outStats.HeapType[2].Stats.BlockCount + outStats.HeapType[3].Stats.BlockCount);

+    D3D12MA_ASSERT(outStats.Total.Stats.AllocationCount =

+        outStats.HeapType[0].Stats.AllocationCount + outStats.HeapType[1].Stats.AllocationCount +

+        outStats.HeapType[2].Stats.AllocationCount + outStats.HeapType[3].Stats.AllocationCount);

+    D3D12MA_ASSERT(outStats.Total.Stats.BlockBytes =

+        outStats.HeapType[0].Stats.BlockBytes + outStats.HeapType[1].Stats.BlockBytes +

+        outStats.HeapType[2].Stats.BlockBytes + outStats.HeapType[3].Stats.BlockBytes);

+    D3D12MA_ASSERT(outStats.Total.Stats.AllocationBytes =

+        outStats.HeapType[0].Stats.AllocationBytes + outStats.HeapType[1].Stats.AllocationBytes +

+        outStats.HeapType[2].Stats.AllocationBytes + outStats.HeapType[3].Stats.AllocationBytes);

+    D3D12MA_ASSERT(outStats.Total.UnusedRangeCount =

+        outStats.HeapType[0].UnusedRangeCount + outStats.HeapType[1].UnusedRangeCount +

+        outStats.HeapType[2].UnusedRangeCount + outStats.HeapType[3].UnusedRangeCount);

 }

 

-void AllocatorPimpl::GetBudget(Budget* outGpuBudget, Budget* outCpuBudget)

+void AllocatorPimpl::GetBudget(Budget* outLocalBudget, Budget* outNonLocalBudget)

 {

-    if(outGpuBudget)

-    {

-        // Taking DEFAULT.

-        outGpuBudget->Stats.BlockCount = m_Budget.m_BlockCount[0];

-        outGpuBudget->Stats.AllocationCount = m_Budget.m_AllocationCount[0];

-        outGpuBudget->Stats.BlockBytes = m_Budget.m_BlockBytes[0];

-        outGpuBudget->Stats.AllocationBytes = m_Budget.m_AllocationBytes[0];

-

-    }

-    if(outCpuBudget)

-    {

-        // Taking UPLOAD + READBACK.

-        outCpuBudget->Stats.BlockCount = m_Budget.m_BlockCount[1] + m_Budget.m_BlockCount[2];

-        outCpuBudget->Stats.AllocationCount = m_Budget.m_AllocationCount[1] + m_Budget.m_AllocationCount[2];

-        outCpuBudget->Stats.BlockBytes = m_Budget.m_BlockBytes[1] + m_Budget.m_BlockBytes[2];

-        outCpuBudget->Stats.AllocationBytes = m_Budget.m_AllocationBytes[1] + m_Budget.m_AllocationBytes[2];

-    }

-    // TODO: What to do with CUSTOM?

+    if(outLocalBudget)

+        m_Budget.GetStatistics(outLocalBudget->Stats, DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY);

+    if(outNonLocalBudget)

+        m_Budget.GetStatistics(outNonLocalBudget->Stats, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY);

 

 #if D3D12MA_DXGI_1_4

     if(m_Adapter3)

     {

-        if(m_Budget.m_OperationsSinceBudgetFetch < 30)

+        if(!m_Budget.ShouldUpdateBudget())

         {

-            MutexLockRead lockRead(m_Budget.m_BudgetMutex, m_UseMutex);

-            if(outGpuBudget)

-            {

-

-                if(m_Budget.m_D3D12UsageLocal + outGpuBudget->Stats.BlockBytes > m_Budget.m_BlockBytesAtBudgetFetch[0])

-                {

-                    outGpuBudget->UsageBytes = m_Budget.m_D3D12UsageLocal +

-                        outGpuBudget->Stats.BlockBytes - m_Budget.m_BlockBytesAtBudgetFetch[0];

-                }

-                else

-                {

-                    outGpuBudget->UsageBytes = 0;

-                }

-                outGpuBudget->BudgetBytes = m_Budget.m_D3D12BudgetLocal;

-            }

-            if(outCpuBudget)

-            {

-                if(m_Budget.m_D3D12UsageNonLocal + outCpuBudget->Stats.BlockBytes > m_Budget.m_BlockBytesAtBudgetFetch[1] + m_Budget.m_BlockBytesAtBudgetFetch[2])

-                {

-                    outCpuBudget->UsageBytes = m_Budget.m_D3D12UsageNonLocal +

-                        outCpuBudget->Stats.BlockBytes - (m_Budget.m_BlockBytesAtBudgetFetch[1] + m_Budget.m_BlockBytesAtBudgetFetch[2]);

-                }

-                else

-                {

-                    outCpuBudget->UsageBytes = 0;

-                }

-                outCpuBudget->BudgetBytes = m_Budget.m_D3D12BudgetNonLocal;

-            }

+            m_Budget.GetBudget(m_UseMutex,

+                outLocalBudget ? &outLocalBudget->UsageBytes : NULL,

+                outLocalBudget ? &outLocalBudget->BudgetBytes : NULL,

+                outNonLocalBudget ? &outNonLocalBudget->UsageBytes : NULL,

+                outNonLocalBudget ? &outNonLocalBudget->BudgetBytes : NULL);

         }

         else

         {

-            UpdateD3D12Budget(); // Outside of mutex lock

-            GetBudget(outGpuBudget, outCpuBudget); // Recursion

+            UpdateD3D12Budget();

+            GetBudget(outLocalBudget, outNonLocalBudget); // Recursion

         }

     }

     else

 #endif

     {

-        if(outGpuBudget)

+        if(outLocalBudget)

         {

-            const UINT64 gpuMemorySize = m_AdapterDesc.DedicatedVideoMemory + m_AdapterDesc.DedicatedSystemMemory; // TODO: Is this right?

-            outGpuBudget->UsageBytes = outGpuBudget->Stats.BlockBytes;

-            outGpuBudget->BudgetBytes = gpuMemorySize * 8 / 10; // 80% heuristics.

+            outLocalBudget->UsageBytes = outLocalBudget->Stats.BlockBytes;

+            outLocalBudget->BudgetBytes = GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY) * 8 / 10; // 80% heuristics.

         }

-        if(outCpuBudget)

+        if(outNonLocalBudget)

         {

-            const UINT64 cpuMemorySize = m_AdapterDesc.SharedSystemMemory; // TODO: Is this right?

-            outCpuBudget->UsageBytes = outCpuBudget->Stats.BlockBytes;

-            outCpuBudget->BudgetBytes = cpuMemorySize * 8 / 10; // 80% heuristics.

+            outNonLocalBudget->UsageBytes = outNonLocalBudget->Stats.BlockBytes;

+            outNonLocalBudget->BudgetBytes = GetMemoryCapacity(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY) * 8 / 10; // 80% heuristics.

         }

     }

 }

@@ -7812,8 +7930,8 @@
     {

         JsonWriter json(GetAllocs(), sb);

 

-        Budget gpuBudget = {}, cpuBudget = {};

-        GetBudget(&gpuBudget, &cpuBudget);

+        Budget localBudget = {}, nonLocalBudget = {};

+        GetBudget(&localBudget, &nonLocalBudget);

 

         TotalStatistics stats;

         CalculateStatistics(stats);

@@ -7831,10 +7949,10 @@
         json.WriteString(L"Budget");

         json.BeginObject();

         {

-            json.WriteString(L"GPU");

-            WriteBudgetToJson(json, gpuBudget);

-            json.WriteString(L"CPU");

-            WriteBudgetToJson(json, cpuBudget);

+            json.WriteString(L"Local");

+            WriteBudgetToJson(json, localBudget);

+            json.WriteString(L"NonLocal");

+            WriteBudgetToJson(json, nonLocalBudget);

         }

         json.EndObject();

 

@@ -7961,36 +8079,10 @@
 HRESULT AllocatorPimpl::UpdateD3D12Budget()

 {

 #if D3D12MA_DXGI_1_4

-    D3D12MA_ASSERT(m_Adapter3);

-

-    DXGI_QUERY_VIDEO_MEMORY_INFO infoLocal = {};

-    DXGI_QUERY_VIDEO_MEMORY_INFO infoNonLocal = {};

-    HRESULT hrLocal = m_Adapter3->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &infoLocal);

-    HRESULT hrNonLocal = m_Adapter3->QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, &infoNonLocal);

-

-    {

-        MutexLockWrite lockWrite(m_Budget.m_BudgetMutex, m_UseMutex);

-

-        if(SUCCEEDED(hrLocal))

-        {

-            m_Budget.m_D3D12UsageLocal = infoLocal.CurrentUsage;

-            m_Budget.m_D3D12BudgetLocal = infoLocal.Budget;

-        }

-        if(SUCCEEDED(hrNonLocal))

-        {

-            m_Budget.m_D3D12UsageNonLocal = infoNonLocal.CurrentUsage;

-            m_Budget.m_D3D12BudgetNonLocal = infoNonLocal.Budget;

-        }

-

-        for(UINT i = 0; i < HEAP_TYPE_COUNT; ++i)

-        {

-            m_Budget.m_BlockBytesAtBudgetFetch[i] = m_Budget.m_BlockBytes[i].load();

-        }

-

-        m_Budget.m_OperationsSinceBudgetFetch = 0;

-    }

-

-    return FAILED(hrLocal) ? hrLocal : hrNonLocal;

+    if(m_Adapter3)

+        return m_Budget.UpdateBudget(m_Adapter3, m_UseMutex);

+    else

+        return E_NOINTERFACE;

 #else

     return S_OK;

 #endif

@@ -8086,6 +8178,40 @@
     json.EndObject();

 }

 

+UINT AllocatorPimpl::StandardHeapTypeToMemorySegmentGroup(D3D12_HEAP_TYPE heapType) const

+{

+    D3D12MA_ASSERT(IsHeapTypeStandard(heapType));

+    if(IsUMA())

+        return DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY;

+    return heapType == D3D12_HEAP_TYPE_DEFAULT ?

+        DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY : DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY;

+}

+

+UINT AllocatorPimpl::HeapPropertiesToMemorySegmentGroup(const D3D12_HEAP_PROPERTIES& heapProps) const

+{

+    if(IsUMA())

+        return DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY;

+    if(heapProps.MemoryPoolPreference == D3D12_MEMORY_POOL_UNKNOWN)

+        return StandardHeapTypeToMemorySegmentGroup(heapProps.Type);

+    return heapProps.MemoryPoolPreference == D3D12_MEMORY_POOL_L1 ?

+        DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY : DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY;

+}

+

+UINT64 AllocatorPimpl::GetMemoryCapacity(UINT memorySegmentGroup) const

+{

+    switch(memorySegmentGroup)

+    {

+    case DXGI_MEMORY_SEGMENT_GROUP_LOCAL_COPY:

+        return IsUMA() ?

+            m_AdapterDesc.DedicatedVideoMemory + m_AdapterDesc.SharedSystemMemory : m_AdapterDesc.DedicatedVideoMemory;

+    case DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL_COPY:

+        return IsUMA() ? 0 : m_AdapterDesc.SharedSystemMemory;

+    default:

+        D3D12MA_ASSERT(0);

+        return UINT64_MAX;

+    }

+}

+

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

 // Public but internal class IUnknownImpl implementation

 

@@ -8347,6 +8473,11 @@
     return m_Pimpl->IsCacheCoherentUMA();

 }

 

+UINT64 Allocator::GetMemoryCapacity(UINT memorySegmentGroup) const

+{

+    return m_Pimpl->GetMemoryCapacity(memorySegmentGroup);

+}

+

 HRESULT Allocator::CreateResource(

     const ALLOCATION_DESC* pAllocDesc,

     const D3D12_RESOURCE_DESC* pResourceDesc,

@@ -8476,14 +8607,14 @@
     m_Pimpl->CalculateStatistics(*pStats);

 }

 

-void Allocator::GetBudget(Budget* pGpuBudget, Budget* pCpuBudget)

+void Allocator::GetBudget(Budget* pLocalBudget, Budget* pNonLocalBudget)

 {

-    if(pGpuBudget == NULL && pCpuBudget == NULL)

+    if(pLocalBudget == NULL && pNonLocalBudget == NULL)

     {

         return;

     }

     D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK

-    m_Pimpl->GetBudget(pGpuBudget, pCpuBudget);

+    m_Pimpl->GetBudget(pLocalBudget, pNonLocalBudget);

 }

 

 void Allocator::BuildStatsString(WCHAR** ppStatsString, BOOL DetailedMap) const

diff --git a/src/Tests.cpp b/src/Tests.cpp
index 22ac2b5..0fe9249 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -1204,14 +1204,16 @@
 

 static void CheckStatistics(const D3D12MA::DetailedStatistics& stats)

 {

+    CHECK_BOOL(stats.Stats.AllocationBytes <= stats.Stats.BlockBytes);

     if(stats.Stats.AllocationBytes > 0)

     {

         CHECK_BOOL(stats.Stats.AllocationCount > 0);

+        CHECK_BOOL(stats.AllocationSizeMin <= stats.AllocationSizeMax);

     }

     if(stats.UnusedRangeCount > 0)

     {

-        CHECK_BOOL(stats.UnusedRangeSizeMin > 0);

         CHECK_BOOL(stats.UnusedRangeSizeMax > 0);

+        CHECK_BOOL(stats.UnusedRangeSizeMin <= stats.UnusedRangeSizeMax);

     }

 }