From 63e78ef3e8003c01a26c76dff4029a68bdb8eb97 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 5 Nov 2017 14:21:41 -0800 Subject: [PATCH 1/2] Vulkan: Fix framebuffer leak. Evident in God of War. --- ext/native/thin3d/VulkanQueueRunner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From b2039bd14fdd0aef755beb2689d3aae6e271ddf6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 5 Nov 2017 14:22:09 -0800 Subject: [PATCH 2/2] Vulkan: Fix leak in WipeQueue(). --- ext/native/thin3d/VulkanRenderManager.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) 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(); }