From 5cf6c7e581cf89cb989fccdf2ae39c9f8f9f9569 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 15 Aug 2025 09:19:30 +0000 Subject: [PATCH] support free empty blocks Signed-off-by: Oliver Change-Id: I2fdb341b88b45364e9a3bf8b17c03687e423522b --- .../include/vk_mem_alloc.h | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/m133/third_party/externals/vulkanmemoryallocator/include/vk_mem_alloc.h b/m133/third_party/externals/vulkanmemoryallocator/include/vk_mem_alloc.h index 0256e7a3be..1951521feb 100644 --- a/m133/third_party/externals/vulkanmemoryallocator/include/vk_mem_alloc.h +++ b/m133/third_party/externals/vulkanmemoryallocator/include/vk_mem_alloc.h @@ -12958,22 +12958,25 @@ VkResult VmaBlockVector::CheckCorruption() void VmaBlockVector::FreeEmptyBlock() { -#ifdef VMA_FORCE_EMPTY_BLOCK_DELETION // Force deletion of empty blocks. VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex); - - if (HasEmptyBlock()) + for(size_t blockIndex = m_Blocks.size(); blockIndex--; ) { - VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back(); - if (pLastBlock->m_pMetadata->IsEmpty()) + VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex]; + if(pBlock->m_pMetadata->IsEmpty()) { - VMA_DEBUG_LOG(" Freeing empty block #%u", pLastBlock->GetId()); - pLastBlock->Destroy(m_hAllocator); - vma_delete(m_hAllocator, pLastBlock); - m_Blocks.pop_back(); + if(m_Blocks.size() > m_MinBlockCount) + { + VmaVectorRemove(m_Blocks, blockIndex); + pBlock->Destroy(m_hAllocator); + vma_delete(m_hAllocator, pBlock); + } + else + { + break; + } } } -#endif } #endif // _VMA_BLOCK_VECTOR_FUNCTIONS -- Gitee