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;