Implemented VmaBlockMetadata_Buddy::GetSumFreeSize.
diff --git a/src/Tests.cpp b/src/Tests.cpp
index bc2b964..8aabf1e 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -4149,7 +4149,7 @@
 {

     wprintf(L"TESTING:\n");

 

-    if(false)

+    if(true)

     {

         // # Temporarily insert custom tests here

         // ########################################

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 53ee588..977d685 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -4956,7 +4956,7 @@
 

     virtual bool Validate() const;

     virtual size_t GetAllocationCount() const { return m_AllocationCount; }

-    virtual VkDeviceSize GetSumFreeSize() const;

+    virtual VkDeviceSize GetSumFreeSize() const { return m_SumFreeSize; }

     virtual VkDeviceSize GetUnusedRangeSizeMax() const;

     virtual bool IsEmpty() const { return m_Root->type == Node::TYPE_FREE; }

 

@@ -5004,9 +5004,11 @@
     struct ValidationContext

     {

         size_t calculatedAllocationCount;

+        VkDeviceSize calculatedSumFreeSize;

 

         ValidationContext() :

-            calculatedAllocationCount(0) { }

+            calculatedAllocationCount(0),

+            calculatedSumFreeSize(0) { }

     };

 

     struct Node

@@ -5047,6 +5049,7 @@
     } m_FreeList[MAX_LEVELS];

     // Number of nodes in the tree with type == TYPE_ALLOCATION.

     size_t m_AllocationCount;

+    VkDeviceSize m_SumFreeSize;

 

     void DeleteNode(Node* node);

     bool ValidateNode(ValidationContext& ctx, const Node* parent, const Node* curr, uint32_t level, VkDeviceSize levelNodeSize) const;

@@ -9169,7 +9172,8 @@
 

 VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(VmaAllocator hAllocator) :

     m_Root(VMA_NULL),

-    m_AllocationCount(0)

+    m_AllocationCount(0),

+    m_SumFreeSize(0)

 {

     memset(m_FreeList, 0, sizeof(m_FreeList));

 }

@@ -9183,6 +9187,8 @@
 {

     VmaBlockMetadata::Init(size);

 

+    m_SumFreeSize = size;

+

     Node* rootNode = new Node();

     rootNode->offset = 0;

     rootNode->type = Node::TYPE_FREE;

@@ -9202,6 +9208,7 @@
         VMA_VALIDATE(false && "ValidateNode failed.");

     }

     VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);

+    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);

 

     // Validate free node lists.

     for(uint32_t level = 0; level < MAX_LEVELS; ++level)

@@ -9229,11 +9236,6 @@
     return true;

 }

 

-VkDeviceSize VmaBlockMetadata_Buddy::GetSumFreeSize() const

-{

-    return 0; // TODO

-}

-

 VkDeviceSize VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax() const

 {

     return 0; // TODO

@@ -9387,6 +9389,7 @@
     currNode->allocation.alloc = hAllocation;

 

     ++m_AllocationCount;

+    m_SumFreeSize -= LevelToNodeSize(currLevel);

 }

 

 void VmaBlockMetadata_Buddy::DeleteNode(Node* node)

@@ -9409,6 +9412,7 @@
     {

     case Node::TYPE_FREE:

         // curr->free.prev, next are validated separately.

+        ctx.calculatedSumFreeSize += levelNodeSize;

         break;

     case Node::TYPE_ALLOCATION:

         ++ctx.calculatedAllocationCount;

@@ -9493,6 +9497,7 @@
     VMA_ASSERT(alloc == VK_NULL_HANDLE || node->allocation.alloc == alloc);

 

     --m_AllocationCount;

+    m_SumFreeSize += levelSize;

 

     node->type = Node::TYPE_FREE;