Removed VMA_DEFRAGMENTATION_* flags. VmaDefragmentationInfo2::flags is now reserved for future use and should be 0. Research various options and chosen some parameters as default.
diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp
index dd5f9b3..1c94841 100644
--- a/src/VmaReplay/VmaReplay.cpp
+++ b/src/VmaReplay/VmaReplay.cpp
@@ -1785,7 +1785,7 @@
         const duration defragDurationEnd   = timeAfterDefragEnd - timeAfterGpu;

 

         // If anything changed.

-        if(defragStats.allocationsLost > 0 || defragStats.allocationsMoved > 0)

+        if(defragStats.allocationsMoved > 0)

         {

             // Go over allocation that changed and destroy their buffers and images.

             size_t i = 0;

@@ -1825,7 +1825,6 @@
         printf("        bytesFreed: %llu\n", defragStats.bytesFreed);

         printf("        allocationsMoved: %u\n", defragStats.allocationsMoved);

         printf("        deviceMemoryBlocksFreed: %u\n", defragStats.deviceMemoryBlocksFreed);

-        printf("        allocationsLost: %u\n", defragStats.allocationsLost);

 

         vmaCalculateStats(m_Allocator, &stats);

         PrintStats(stats, "after defragmentation");

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index de01504..a984d22 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -2578,25 +2578,8 @@
 */

 VK_DEFINE_HANDLE(VmaDefragmentationContext)

 

-/// Flags to be used in vmaDefragmentationBegin().

+/// Flags to be used in vmaDefragmentationBegin(). None at the moment. Reserved for future use.

 typedef enum VmaDefragmentationFlagBits {

-    /** Add this flag to change defragmentation algorithm to fast rather than default (balanced).

-    This algorithm will favor speed over quality of defragmentation.

-    Defragmentation will be done as fast and move as little allocations and bytes as possible while

-    still providing some benefits.

-    */

-    VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT = 0x00000001,

-    /** Add this flag to change defragmentation algorithm to optimal rather than default (balanced).

-    This algorithm will favor quality of defragmentation over speed.

-    Allocations will be as perfectly compacted as possible.

-    */

-    VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT = 0x00000002,

-    /** \brief A bit mask to extract only `ALGORITHM` bits from entire set of flags.

-    */

-    VMA_DEFRAGMENTATION_ALGORITHM_MASK =

-        VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT |

-        VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT,

-

     VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF

 } VmaDefragmentationFlagBits;

 typedef VkFlags VmaDefragmentationFlags;

@@ -2606,7 +2589,7 @@
 To be used with function vmaDefragmentationBegin().

 */

 typedef struct VmaDefragmentationInfo2 {

-    /** \brief Flags for defragmentation. Use #VmaDefragmentationFlagBits enum.

+    /** \brief Reserved for future use. Should be 0.

     */

     VmaDefragmentationFlags flags;

     /** \brief Number of allocations in `pAllocations` array.

@@ -5737,8 +5720,7 @@
     VmaDefragmentationAlgorithm(

         VmaAllocator hAllocator,

         VmaBlockVector* pBlockVector,

-        uint32_t currentFrameIndex,

-        uint32_t algorithmFlags); // Zero or one of VMA_DEFRAGMENTATION_*_ALGORITHM_BIT.

+        uint32_t currentFrameIndex);

     virtual ~VmaDefragmentationAlgorithm();

 

     void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);

@@ -5756,7 +5738,6 @@
     VmaAllocator const m_hAllocator;

     VmaBlockVector* const m_pBlockVector;

     const uint32_t m_CurrentFrameIndex;

-    const uint32_t m_AlgorithmFlags;

 

     uint32_t m_AllocationCount;

     bool m_AllAllocations;

@@ -5819,7 +5800,7 @@
             m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;

         }

 

-        void SortAllocationsBySizeDescecnding()

+        void SortAllocationsBySizeDescending()

         {

             VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());

         }

@@ -5911,7 +5892,7 @@
         VmaPool hCustomPool, // Optional.

         VmaBlockVector* pBlockVector,

         uint32_t currFrameIndex,

-        uint32_t algorithmFlags); // Zero or one of VMA_DEFRAGMENTATION_*_ALGORITHM_BIT.

+        uint32_t flags);

     ~VmaBlockVectorDefragmentationContext();

 

     VmaPool GetCustomPool() const { return m_hCustomPool; }

@@ -5952,7 +5933,7 @@
     VmaDefragmentationContext_T(

         VmaAllocator hAllocator,

         uint32_t currFrameIndex,

-        uint32_t algorithmFlags,

+        uint32_t flags,

         VmaDefragmentationStats* pStats);

     ~VmaDefragmentationContext_T();

 

@@ -5976,7 +5957,7 @@
 private:

     const VmaAllocator m_hAllocator;

     const uint32_t m_CurrFrameIndex;

-    const uint32_t m_AlgorithmFlags;

+    const uint32_t m_Flags;

     VmaDefragmentationStats* const m_pStats;

     // Owner of these objects.

     VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];

@@ -11896,12 +11877,10 @@
 VmaDefragmentationAlgorithm::VmaDefragmentationAlgorithm(

     VmaAllocator hAllocator,

     VmaBlockVector* pBlockVector,

-    uint32_t currentFrameIndex,

-    uint32_t algorithmFlags) :

+    uint32_t currentFrameIndex) :

     m_hAllocator(hAllocator),

     m_pBlockVector(pBlockVector),

     m_CurrentFrameIndex(currentFrameIndex),

-    m_AlgorithmFlags(algorithmFlags),

     m_AllAllocations(false),

     m_AllocationCount(0),

     m_BytesMoved(0),

@@ -11961,21 +11940,17 @@
         return VK_SUCCESS;

     }

 

-    uint32_t strategy = UINT32_MAX;

-    switch(m_AlgorithmFlags)

-    {

-    case VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT:

-        strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT;

-        break;

-    case VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT:

-        strategy = VMA_ALLOCATION_INTERNAL_STRATEGY_MIN_OFFSET;

-        break;

-    default:

-        strategy = VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT;

-    }

+    // This is a choice based on research.

+    // Option 1:

+    uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT;

+    // Option 2:

+    //uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT;

+    // Option 3:

+    //uint32_t strategy = VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT;

 

     size_t srcBlockMinIndex = 0;

     // When FAST_ALGORITHM, move allocations from only last out of blocks that contain non-movable allocations.

+    /*

     if(m_AlgorithmFlags & VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT)

     {

         const size_t blocksWithNonMovableCount = CalcBlocksWithNonMovableCount();

@@ -11984,6 +11959,7 @@
             srcBlockMinIndex = blocksWithNonMovableCount - 1;

         }

     }

+    */

 

     size_t srcBlockIndex = m_Blocks.size() - 1;

     size_t srcAllocIndex = SIZE_MAX;

@@ -12146,21 +12122,21 @@
         }

 

         pBlockInfo->CalcHasNonMovableAllocations();

-        if((m_AlgorithmFlags & VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT) != 0)

-        {

-            pBlockInfo->SortAllocationsByOffsetDescending();

-        }

-        else

-        {

-            pBlockInfo->SortAllocationsBySizeDescecnding();

-        }

+        

+        // This is a choice based on research.

+        // Option 1:

+        pBlockInfo->SortAllocationsByOffsetDescending();

+        // Option 2:

+        //pBlockInfo->SortAllocationsBySizeDescending();

     }

 

     // Sort m_Blocks this time by the main criterium, from most "destination" to most "source" blocks.

     VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());

 

+    // This is a choice based on research.

+    const uint32_t roundCount = 2;

+

     // Execute defragmentation rounds (the main part).

-    const uint32_t roundCount = (m_AlgorithmFlags & VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT) ? 1 : 2;

     VkResult result = VK_SUCCESS;

     for(uint32_t round = 0; (round < roundCount) && (result == VK_SUCCESS); ++round)

     {

@@ -12229,7 +12205,7 @@
         m_Allocations.size() == m_pBlockVector->CalcAllocationCount();

 

     m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm)(

-        m_hAllocator, m_pBlockVector, m_CurrFrameIndex, m_AlgorithmFlags);

+        m_hAllocator, m_pBlockVector, m_CurrFrameIndex);

 

     if(allAllocations)

     {

@@ -12250,11 +12226,11 @@
 VmaDefragmentationContext_T::VmaDefragmentationContext_T(

     VmaAllocator hAllocator,

     uint32_t currFrameIndex,

-    uint32_t algorithmFlags,

+    uint32_t flags,

     VmaDefragmentationStats* pStats) :

     m_hAllocator(hAllocator),

     m_CurrFrameIndex(currFrameIndex),

-    m_AlgorithmFlags(algorithmFlags),

+    m_Flags(flags),

     m_pStats(pStats),

     m_CustomPoolContexts(VmaStlAllocator<VmaBlockVectorDefragmentationContext*>(hAllocator->GetAllocationCallbacks()))

 {

@@ -12307,7 +12283,7 @@
                     pool,

                     &pool->m_BlockVector,

                     m_CurrFrameIndex,

-                    m_AlgorithmFlags);

+                    m_Flags);

                 m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);

             }

 

@@ -12355,7 +12331,7 @@
                             hAllocPool,

                             &hAllocPool->m_BlockVector,

                             m_CurrFrameIndex,

-                            m_AlgorithmFlags);

+                            m_Flags);

                         m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);

                     }

                 }

@@ -12372,7 +12348,7 @@
                         VMA_NULL, // hCustomPool

                         m_hAllocator->m_pBlockVectors[memTypeIndex],

                         m_CurrFrameIndex,

-                        m_AlgorithmFlags);

+                        m_Flags);

                     m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;

                 }

             }

@@ -13713,9 +13689,8 @@
         memset(info.pAllocationsChanged, 0, info.allocationCount * sizeof(VkBool32));

     }

 

-    const uint32_t algorithmFlags = info.flags & VMA_DEFRAGMENTATION_ALGORITHM_MASK;

     *pContext = vma_new(this, VmaDefragmentationContext_T)(

-        this, m_CurrentFrameIndex.load(), algorithmFlags, pStats);

+        this, m_CurrentFrameIndex.load(), info.flags, pStats);

 

     (*pContext)->AddPools(info.poolCount, info.pPools);

     (*pContext)->AddAllocations(