diff --git a/ext/native/thin3d/VulkanQueueRunner.cpp b/ext/native/thin3d/VulkanQueueRunner.cpp index 10948f82b2..50fbf123bd 100644 --- a/ext/native/thin3d/VulkanQueueRunner.cpp +++ b/ext/native/thin3d/VulkanQueueRunner.cpp @@ -326,8 +326,8 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c vkCmdPipelineBarrier(cmd, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &barrier); iter.fb->color.layout = barrier.newLayout; - iter.fb->Release(); } + iter.fb->Release(); } // This is supposed to bind a vulkan render pass to the command buffer. diff --git a/ext/native/thin3d/VulkanRenderManager.cpp b/ext/native/thin3d/VulkanRenderManager.cpp index b87f9a6d63..88009d666a 100644 --- a/ext/native/thin3d/VulkanRenderManager.cpp +++ b/ext/native/thin3d/VulkanRenderManager.cpp @@ -616,8 +616,27 @@ void VulkanRenderManager::Finish() { void VulkanRenderManager::Wipe() { int curFrame = vulkan_->GetCurFrame(); - for (auto iter : steps_) { - delete iter; + for (auto step : steps_) { + // Need to release held framebuffers. + switch (step->stepType) { + case VKRStepType::RENDER: + for (const auto &iter : step->preTransitions) { + iter.fb->Release(); + } + break; + case VKRStepType::COPY: + step->copy.src->Release(); + step->copy.dst->Release(); + break; + case VKRStepType::BLIT: + step->blit.src->Release(); + step->blit.dst->Release(); + break; + case VKRStepType::READBACK: + step->readback.src->Release(); + break; + } + delete step; } steps_.clear(); }