Made VmaDefragmentationAlgorithm an abstract class and specific implementation as new class VmaDefragmentationAlgorithm_Generic, so user can easily plug his own defragmentation algorithms.
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index a984d22..f39cd12 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -5089,7 +5089,7 @@
virtual bool ResizeAllocation(const VmaAllocation alloc, VkDeviceSize newSize);
private:
- friend class VmaDefragmentationAlgorithm;
+ friend class VmaDefragmentationAlgorithm_Generic;
uint32_t m_FreeCount;
VkDeviceSize m_SumFreeSize;
@@ -5621,7 +5621,7 @@
size_t CalcAllocationCount();
private:
- friend class VmaDefragmentationAlgorithm;
+ friend class VmaDefragmentationAlgorithm_Generic;
const VmaAllocator m_hAllocator;
const uint32_t m_MemoryTypeIndex;
@@ -5720,31 +5720,32 @@
VmaDefragmentationAlgorithm(
VmaAllocator hAllocator,
VmaBlockVector* pBlockVector,
- uint32_t currentFrameIndex);
- virtual ~VmaDefragmentationAlgorithm();
+ uint32_t currentFrameIndex) :
+ m_hAllocator(hAllocator),
+ m_pBlockVector(pBlockVector),
+ m_CurrentFrameIndex(currentFrameIndex)
+ {
+ }
+ virtual ~VmaDefragmentationAlgorithm()
+ {
+ }
- void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);
- void AddAll() { m_AllAllocations = true; }
+ virtual void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged) = 0;
+ virtual void AddAll() = 0;
- VkResult Defragment(
+ virtual VkResult Defragment(
VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,
VkDeviceSize maxBytesToMove,
- uint32_t maxAllocationsToMove);
+ uint32_t maxAllocationsToMove) = 0;
- VkDeviceSize GetBytesMoved() const { return m_BytesMoved; }
- uint32_t GetAllocationsMoved() const { return m_AllocationsMoved; }
+ virtual VkDeviceSize GetBytesMoved() const = 0;
+ virtual uint32_t GetAllocationsMoved() const = 0;
-private:
+protected:
VmaAllocator const m_hAllocator;
VmaBlockVector* const m_pBlockVector;
const uint32_t m_CurrentFrameIndex;
- uint32_t m_AllocationCount;
- bool m_AllAllocations;
-
- VkDeviceSize m_BytesMoved;
- uint32_t m_AllocationsMoved;
-
struct AllocationInfo
{
VmaAllocation m_hAllocation;
@@ -5761,6 +5762,35 @@
{
}
};
+};
+
+class VmaDefragmentationAlgorithm_Generic : public VmaDefragmentationAlgorithm
+{
+ VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm_Generic)
+public:
+ VmaDefragmentationAlgorithm_Generic(
+ VmaAllocator hAllocator,
+ VmaBlockVector* pBlockVector,
+ uint32_t currentFrameIndex);
+ virtual ~VmaDefragmentationAlgorithm_Generic();
+
+ virtual void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);
+ virtual void AddAll() { m_AllAllocations = true; }
+
+ virtual VkResult Defragment(
+ VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,
+ VkDeviceSize maxBytesToMove,
+ uint32_t maxAllocationsToMove);
+
+ virtual VkDeviceSize GetBytesMoved() const { return m_BytesMoved; }
+ virtual uint32_t GetAllocationsMoved() const { return m_AllocationsMoved; }
+
+private:
+ uint32_t m_AllocationCount;
+ bool m_AllAllocations;
+
+ VkDeviceSize m_BytesMoved;
+ uint32_t m_AllocationsMoved;
struct AllocationInfoSizeGreater
{
@@ -11872,15 +11902,13 @@
}
////////////////////////////////////////////////////////////////////////////////
-// VmaDefragmentationAlgorithm members definition
+// VmaDefragmentationAlgorithm_Generic members definition
-VmaDefragmentationAlgorithm::VmaDefragmentationAlgorithm(
+VmaDefragmentationAlgorithm_Generic::VmaDefragmentationAlgorithm_Generic(
VmaAllocator hAllocator,
VmaBlockVector* pBlockVector,
uint32_t currentFrameIndex) :
- m_hAllocator(hAllocator),
- m_pBlockVector(pBlockVector),
- m_CurrentFrameIndex(currentFrameIndex),
+ VmaDefragmentationAlgorithm(hAllocator, pBlockVector, currentFrameIndex),
m_AllAllocations(false),
m_AllocationCount(0),
m_BytesMoved(0),
@@ -11901,7 +11929,7 @@
VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());
}
-VmaDefragmentationAlgorithm::~VmaDefragmentationAlgorithm()
+VmaDefragmentationAlgorithm_Generic::~VmaDefragmentationAlgorithm_Generic()
{
for(size_t i = m_Blocks.size(); i--; )
{
@@ -11909,7 +11937,7 @@
}
}
-void VmaDefragmentationAlgorithm::AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged)
+void VmaDefragmentationAlgorithm_Generic::AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged)
{
// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.
if(hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)
@@ -11930,7 +11958,7 @@
}
}
-VkResult VmaDefragmentationAlgorithm::DefragmentRound(
+VkResult VmaDefragmentationAlgorithm_Generic::DefragmentRound(
VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,
VkDeviceSize maxBytesToMove,
uint32_t maxAllocationsToMove)
@@ -12078,7 +12106,7 @@
}
}
-size_t VmaDefragmentationAlgorithm::CalcBlocksWithNonMovableCount() const
+size_t VmaDefragmentationAlgorithm_Generic::CalcBlocksWithNonMovableCount() const
{
size_t result = 0;
for(size_t i = 0; i < m_Blocks.size(); ++i)
@@ -12091,7 +12119,7 @@
return result;
}
-VkResult VmaDefragmentationAlgorithm::Defragment(
+VkResult VmaDefragmentationAlgorithm_Generic::Defragment(
VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,
VkDeviceSize maxBytesToMove,
uint32_t maxAllocationsToMove)
@@ -12146,7 +12174,7 @@
return result;
}
-bool VmaDefragmentationAlgorithm::MoveMakesSense(
+bool VmaDefragmentationAlgorithm_Generic::MoveMakesSense(
size_t dstBlockIndex, VkDeviceSize dstOffset,
size_t srcBlockIndex, VkDeviceSize srcOffset)
{
@@ -12204,7 +12232,7 @@
const bool allAllocations = m_AllAllocations ||
m_Allocations.size() == m_pBlockVector->CalcAllocationCount();
- m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm)(
+ m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm_Generic)(
m_hAllocator, m_pBlockVector, m_CurrFrameIndex);
if(allAllocations)