.
diff --git a/src/VmaReplay/VmaUsage.h b/src/VmaReplay/VmaUsage.h
index 182132b..cf93a33 100644
--- a/src/VmaReplay/VmaUsage.h
+++ b/src/VmaReplay/VmaUsage.h
@@ -9,7 +9,7 @@
 

 //#define VMA_USE_STL_CONTAINERS 1

 

-//#define VMA_HEAVY_ASSERT(expr) assert(expr)

+#define VMA_HEAVY_ASSERT(expr) assert(expr)

 

 //#define VMA_DEDICATED_ALLOCATION 0

 

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 3a27dc9..9d21090 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -4942,7 +4942,7 @@
     virtual size_t GetAllocationCount() const;

     virtual VkDeviceSize GetSumFreeSize() const;

     virtual VkDeviceSize GetUnusedRangeSizeMax() const;

-    virtual bool IsEmpty() const;

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

 

     virtual void CalcAllocationStatInfo(VmaStatInfo& outInfo) const;

     virtual void AddPoolStats(VmaPoolStats& inoutStats) const;

@@ -4979,8 +4979,8 @@
         bool upperAddress,

         VmaAllocation hAllocation);

 

-    virtual void Free(const VmaAllocation allocation);

-    virtual void FreeAtOffset(VkDeviceSize offset);

+    virtual void Free(const VmaAllocation allocation) { FreeAtOffset(allocation, allocation->GetOffset()); }

+    virtual void FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }

 

 private:

     static const size_t MAX_LEVELS = 30; // TODO

@@ -4997,6 +4997,7 @@
         } type;

         Node* parent;

         Node* buddy;

+

         union

         {

             struct

@@ -9351,11 +9352,6 @@
     return 0; // TODO

 }

 

-bool VmaBlockMetadata_Buddy::IsEmpty() const

-{

-    return m_Root->type == Node::TYPE_FREE;

-}

-

 void VmaBlockMetadata_Buddy::CalcAllocationStatInfo(VmaStatInfo& outInfo) const

 {

     outInfo.blockCount = 1;

@@ -9509,16 +9505,6 @@
     currNode->allocation.alloc = hAllocation;

 }

 

-void VmaBlockMetadata_Buddy::Free(const VmaAllocation allocation)

-{

-    FreeAtOffset(allocation, allocation->GetOffset());

-}

-

-void VmaBlockMetadata_Buddy::FreeAtOffset(VkDeviceSize offset)

-{

-    FreeAtOffset(VMA_NULL, offset);

-}

-

 void VmaBlockMetadata_Buddy::DeleteNode(Node* node)

 {

     if(node->type == Node::TYPE_SPLIT)

@@ -9547,6 +9533,7 @@
     switch(curr->type)

     {

     case Node::TYPE_FREE:

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

         break;

     case Node::TYPE_ALLOCATION:

         if(curr->allocation.alloc == VK_NULL_HANDLE)

@@ -9619,20 +9606,23 @@
 {

     // Find node and level.

     Node* node = m_Root;

+    VkDeviceSize nodeOffset = 0;

     uint32_t level = 0;

+    VkDeviceSize levelSize = GetSize();

     while(node->type == Node::TYPE_SPLIT)

     {

-        Node* leftChild = node->split.leftChild;

-        Node* rightChild = leftChild->buddy;

-        if(offset < rightChild->offset) // TODO could be calculated

+        const VkDeviceSize nextLevelSize = levelSize / 2;

+        if(offset < nodeOffset + nextLevelSize)

         {

-            node = leftChild;

+            node = node->split.leftChild;

         }

         else

         {

-            node = rightChild;

+            node = node->split.leftChild->buddy;

+            nodeOffset += nextLevelSize;

         }

         ++level;

+        levelSize = nextLevelSize;

     }

 

     VMA_ASSERT(node != VMA_NULL && node->type == Node::TYPE_ALLOCATION);