VmaBlockMetadata_Buddy: Fixed allocation of Node objects to use provided CPU allocation callbacks.
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 844454f..3ada40c 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -4617,7 +4617,7 @@
class VmaBlockMetadata
{
public:
- VmaBlockMetadata() : m_Size(0) { }
+ VmaBlockMetadata(VmaAllocator hAllocator);
virtual ~VmaBlockMetadata() { }
virtual void Init(VkDeviceSize size) { m_Size = size; }
@@ -4675,6 +4675,8 @@
virtual void FreeAtOffset(VkDeviceSize offset) = 0;
protected:
+ const VkAllocationCallbacks* GetAllocationCallbacks() const { return m_pAllocationCallbacks; }
+
#if VMA_STATS_STRING_ENABLED
void PrintDetailedMap_Begin(class VmaJsonWriter& json,
VkDeviceSize unusedBytes,
@@ -4691,6 +4693,7 @@
private:
VkDeviceSize m_Size;
+ const VkAllocationCallbacks* m_pAllocationCallbacks;
};
#define VMA_VALIDATE(cond) do { if(!(cond)) { \
@@ -6540,6 +6543,12 @@
////////////////////////////////////////////////////////////////////////////////
// class VmaBlockMetadata
+VmaBlockMetadata::VmaBlockMetadata(VmaAllocator hAllocator) :
+ m_Size(0),
+ m_pAllocationCallbacks(hAllocator->GetAllocationCallbacks())
+{
+}
+
#if VMA_STATS_STRING_ENABLED
void VmaBlockMetadata::PrintDetailedMap_Begin(class VmaJsonWriter& json,
@@ -6609,6 +6618,7 @@
// class VmaBlockMetadata_Generic
VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(VmaAllocator hAllocator) :
+ VmaBlockMetadata(hAllocator),
m_FreeCount(0),
m_SumFreeSize(0),
m_Suballocations(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),
@@ -7538,6 +7548,7 @@
// class VmaBlockMetadata_Linear
VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(VmaAllocator hAllocator) :
+ VmaBlockMetadata(hAllocator),
m_SumFreeSize(0),
m_Suballocations0(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),
m_Suballocations1(VmaStlAllocator<VmaSuballocation>(hAllocator->GetAllocationCallbacks())),
@@ -9215,6 +9226,7 @@
// class VmaBlockMetadata_Buddy
VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(VmaAllocator hAllocator) :
+ VmaBlockMetadata(hAllocator),
m_Root(VMA_NULL),
m_AllocationCount(0),
m_FreeCount(1),
@@ -9243,7 +9255,7 @@
++m_LevelCount;
}
- Node* rootNode = new Node();
+ Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();
rootNode->offset = 0;
rootNode->type = Node::TYPE_FREE;
rootNode->parent = VMA_NULL;
@@ -9478,8 +9490,8 @@
const uint32_t childrenLevel = currLevel + 1;
// Create two free sub-nodes.
- Node* leftChild = new Node();
- Node* rightChild = new Node();
+ Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();
+ Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();
leftChild->offset = currNode->offset;
leftChild->type = Node::TYPE_FREE;
@@ -9533,7 +9545,7 @@
DeleteNode(node->split.leftChild);
}
- delete node;
+ vma_delete(GetAllocationCallbacks(), node);
}
bool VmaBlockMetadata_Buddy::ValidateNode(ValidationContext& ctx, const Node* parent, const Node* curr, uint32_t level, VkDeviceSize levelNodeSize) const
@@ -9633,8 +9645,8 @@
RemoveFromFreeList(level, node->buddy);
Node* const parent = node->parent;
- delete node->buddy;
- delete node;
+ vma_delete(GetAllocationCallbacks(), node->buddy);
+ vma_delete(GetAllocationCallbacks(), node);
parent->type = Node::TYPE_FREE;
node = parent;
@@ -12474,7 +12486,7 @@
// This allocation belongs to custom pool.
if(hAllocPool != VK_NULL_HANDLE)
{
- // Pools with linear algorithm are not defragmented.
+ // Pools with linear or buddy algorithm are not defragmented.
if(hAllocPool->m_BlockVector.GetAlgorithm() == 0)
{
pAllocBlockVector = &hAllocPool->m_BlockVector;