From fc84f258187d2cd5dc447f62e00e5adcc1f78ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Sep 2022 12:09:56 +0200 Subject: [PATCH] Quick GE debugger stepping fix, after the recent vulkan swapchain acquire change --- Common/GPU/Vulkan/VulkanFrameData.h | 1 + Common/GPU/Vulkan/VulkanQueueRunner.cpp | 13 +++++++------ Common/GPU/Vulkan/VulkanRenderManager.cpp | 3 +++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanFrameData.h b/Common/GPU/Vulkan/VulkanFrameData.h index 21c44404b9..d7093c2f42 100644 --- a/Common/GPU/Vulkan/VulkanFrameData.h +++ b/Common/GPU/Vulkan/VulkanFrameData.h @@ -49,6 +49,7 @@ struct FrameData { bool hasInitCommands = false; bool hasPresentCommands = false; + bool hasAcquired = false; std::vector steps; diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index 2056463261..5d9b1b1adf 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -561,15 +561,16 @@ void VulkanQueueRunner::RunSteps(FrameData &frameData) { switch (step.stepType) { case VKRStepType::RENDER: if (!step.render.framebuffer) { - _dbg_assert_(!frameData.hasPresentCommands); - if (!frameData.hasPresentCommands) { - frameData.hasPresentCommands = true; + // When stepping in the GE debugger, we can end up here multiple times in a "frame". + if (!frameData.hasAcquired) { + frameData.hasAcquired = true; frameData.AcquireNextImage(vulkan_); SetBackbuffer(framebuffers_[frameData.curSwapchainImage], swapchainImages_[frameData.curSwapchainImage].image); - VkCommandBufferBeginInfo begin{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; - begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - vkBeginCommandBuffer(frameData.presentCmd, &begin); } + VkCommandBufferBeginInfo begin{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; + begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + vkBeginCommandBuffer(frameData.presentCmd, &begin); + frameData.hasPresentCommands = true; PerformRenderPass(step, frameData.presentCmd); } else { PerformRenderPass(step, frameData.mainCmd); diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index d2973abb5a..1bf93caebc 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -1385,6 +1385,8 @@ void VulkanRenderManager::EndSubmitFrame(int frame) { present.pWaitSemaphores = &renderingCompleteSemaphore_; present.waitSemaphoreCount = 1; + _dbg_assert_(frameData.hasAcquired); + VkResult res = vkQueuePresentKHR(vulkan_->GetGraphicsQueue(), &present); if (res == VK_ERROR_OUT_OF_DATE_KHR) { // We clearly didn't get this in vkAcquireNextImageKHR because of the skipSwap check above. @@ -1398,6 +1400,7 @@ void VulkanRenderManager::EndSubmitFrame(int frame) { // Success outOfDateFrames_ = 0; } + frameData.hasAcquired = false; } else { // We only get here if vkAcquireNextImage returned VK_ERROR_OUT_OF_DATE. outOfDateFrames_++;