Fixed budget management in VmaBlockVector::Allocate for cases when some of multi-page allocations fail

This commit is contained in:
Adam Sawicki 2021-02-23 18:21:42 +01:00
parent 7e56c486fa
commit a420c3d752
2 changed files with 9 additions and 5 deletions

View File

@ -547,7 +547,7 @@ void TestSparseBinding()
RandomNumberGenerator rand(4652467); RandomNumberGenerator rand(4652467);
for(uint32_t i = 0; i < frameCount; ++i) for(uint32_t frameIndex = 0; frameIndex < frameCount; ++frameIndex)
{ {
// Bump frame index. // Bump frame index.
++g_FrameIndex; ++g_FrameIndex;
@ -562,11 +562,11 @@ void TestSparseBinding()
images.push_back(std::move(imageInfo)); images.push_back(std::move(imageInfo));
// Delete all images that expired. // 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);
} }
} }
} }

View File

@ -12773,9 +12773,13 @@ VkResult VmaBlockVector::Allocate(
if(res != VK_SUCCESS) if(res != VK_SUCCESS)
{ {
// Free all already created allocations. // Free all already created allocations.
const uint32_t heapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(m_MemoryTypeIndex);
while(allocIndex--) 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); memset(pAllocations, 0, sizeof(VmaAllocation) * allocationCount);
} }