From cca4e0b2ca64d9bc1518233003d0f472bcfdccbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 10 Dec 2017 14:36:24 +0100 Subject: [PATCH] Fix another case where we trusted std::move to clear the origin, which is not guaranteed. --- Common/Vulkan/VulkanContext.cpp | 17 +++++++++++++++++ Common/Vulkan/VulkanMemory.cpp | 2 +- Common/Vulkan/VulkanMemory.h | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Common/Vulkan/VulkanContext.cpp b/Common/Vulkan/VulkanContext.cpp index cb3c6fbd3b..88f888883a 100644 --- a/Common/Vulkan/VulkanContext.cpp +++ b/Common/Vulkan/VulkanContext.cpp @@ -1039,6 +1039,8 @@ void VulkanDeleteList::Take(VulkanDeleteList &del) { assert(pipelineCaches_.size() == 0); assert(renderPasses_.size() == 0); assert(framebuffers_.size() == 0); + assert(pipelineLayouts_.size() == 0); + assert(descSetLayouts_.size() == 0); assert(callbacks_.size() == 0); cmdPools_ = std::move(del.cmdPools_); descPools_ = std::move(del.descPools_); @@ -1056,6 +1058,21 @@ void VulkanDeleteList::Take(VulkanDeleteList &del) { pipelineLayouts_ = std::move(del.pipelineLayouts_); descSetLayouts_ = std::move(del.descSetLayouts_); callbacks_ = std::move(del.callbacks_); + del.cmdPools_.clear(); + del.descPools_.clear(); + del.modules_.clear(); + del.buffers_.clear(); + del.images_.clear(); + del.imageViews_.clear(); + del.deviceMemory_.clear(); + del.samplers_.clear(); + del.pipelines_.clear(); + del.pipelineCaches_.clear(); + del.renderPasses_.clear(); + del.framebuffers_.clear(); + del.pipelineLayouts_.clear(); + del.descSetLayouts_.clear(); + del.callbacks_.clear(); } void VulkanDeleteList::PerformDeletes(VkDevice device) { diff --git a/Common/Vulkan/VulkanMemory.cpp b/Common/Vulkan/VulkanMemory.cpp index 3e72505f51..a77fa7e878 100644 --- a/Common/Vulkan/VulkanMemory.cpp +++ b/Common/Vulkan/VulkanMemory.cpp @@ -353,7 +353,7 @@ void VulkanDeviceAllocator::ExecuteFree(FreeInfo *userdata) { slab.allocSizes.erase(it); } else { // Ack, a double free? - Crash(); + _assert_msg_(G3D, false, "Double free? Block missing at offset %d", userdata->offset); } found = true; break; diff --git a/Common/Vulkan/VulkanMemory.h b/Common/Vulkan/VulkanMemory.h index 00fe4fcbed..94cd1e837d 100644 --- a/Common/Vulkan/VulkanMemory.h +++ b/Common/Vulkan/VulkanMemory.h @@ -180,7 +180,7 @@ private: static void DispatchFree(void *userdata) { auto freeInfo = static_cast(userdata); - freeInfo->allocator->ExecuteFree(freeInfo); + freeInfo->allocator->ExecuteFree(freeInfo); // this deletes freeInfo } bool AllocateSlab(VkDeviceSize minBytes);