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);
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 @@ void TestSparseBinding()
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);
}
}
}

View File

@ -12773,9 +12773,13 @@ VkResult VmaBlockVector::Allocate(
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);
}