From f6cb6c76951b98ad1ab8911b32117387db1e401d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 20 Sep 2022 17:52:35 +0200 Subject: [PATCH] Submit main command buffer before acquire. Fix sync bug. --- Common/GPU/Vulkan/VulkanFrameData.cpp | 8 ++++---- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanFrameData.cpp b/Common/GPU/Vulkan/VulkanFrameData.cpp index adac358f8f..2c9c2487fc 100644 --- a/Common/GPU/Vulkan/VulkanFrameData.cpp +++ b/Common/GPU/Vulkan/VulkanFrameData.cpp @@ -126,16 +126,16 @@ void FrameData::SubmitPending(VulkanContext *vulkan, FrameSubmitType type, Frame hasInitCommands = false; } + if ((hasMainCommands || hasPresentCommands) && type == FrameSubmitType::Sync) { + fenceToTrigger = readbackFence; + } + if (hasMainCommands) { VkResult res = vkEndCommandBuffer(mainCmd); _assert_msg_(res == VK_SUCCESS, "vkEndCommandBuffer failed (main)! result=%s", VulkanResultToString(res)); cmdBufs[numCmdBufs++] = mainCmd; hasMainCommands = false; - - if (type == FrameSubmitType::Sync) { - fenceToTrigger = readbackFence; - } } if (hasPresentCommands) { diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index d2442ae7c7..8127114148 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -563,6 +563,8 @@ void VulkanQueueRunner::RunSteps(FrameData &frameData, FrameDataShared &frameDat switch (step.stepType) { case VKRStepType::RENDER: if (!step.render.framebuffer) { + frameData.SubmitPending(vulkan_, FrameSubmitType::Pending, frameDataShared); + // When stepping in the GE debugger, we can end up here multiple times in a "frame". // So only acquire once. if (!frameData.hasAcquired) { @@ -570,6 +572,7 @@ void VulkanQueueRunner::RunSteps(FrameData &frameData, FrameDataShared &frameDat SetBackbuffer(framebuffers_[frameData.curSwapchainImage], swapchainImages_[frameData.curSwapchainImage].image); } + _dbg_assert_(!frameData.hasPresentCommands); // A RENDER step rendering to the backbuffer is normally the last step that happens in a frame, // unless taking a screenshot, in which case there might be a READBACK_IMAGE after it. // This is why we have to switch cmd to presentCmd, in this case.