Fixed budget management in VmaBlockVector::Allocate for cases when some of multi-page allocations fail
diff --git a/src/SparseBindingTest.cpp b/src/SparseBindingTest.cpp
index 4299db1..ce4d2db 100644
--- a/src/SparseBindingTest.cpp
+++ b/src/SparseBindingTest.cpp
@@ -547,7 +547,7 @@
RandomNumberGenerator rand(4652467);
- for(uint32_t i = 0; i < frameCount; ++i)
+ for(uint32_t frameIndex = 0; frameIndex < frameCount; ++frameIndex)
{
// Bump frame index.
++g_FrameIndex;
@@ -562,11 +562,11 @@
images.push_back(std::move(imageInfo));
// Delete all images that expired.
- for(size_t i = images.size(); i--; )
+ for(size_t imageIndex = images.size(); imageIndex--; )
{
- if(g_FrameIndex >= images[i].endFrame)
+ if(g_FrameIndex >= images[imageIndex].endFrame)
{
- images.erase(images.begin() + i);
+ images.erase(images.begin() + imageIndex);
}
}
}
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 3a7ae8d..39d7034 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -12773,9 +12773,13 @@
if(res != VK_SUCCESS)
{
// Free all already created allocations.
+ const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);
while(allocIndex--)
{
- Free(pAllocations[allocIndex]);
+ VmaAllocation_T* const alloc = pAllocations[allocIndex];
+ const VkDeviceSize allocSize = alloc->GetSize();
+ Free(alloc);
+ m_hAllocator->m_Budget.RemoveAllocation(heapIndex, allocSize);
}
memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);
}