aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2026-01-23 00:23:02 +0100
committercrueter <crueter@eden-emu.dev>2026-01-23 00:23:02 +0100
commitde449d2caa1925ea36da33ddc97693fe491877b7 (patch)
treee69804e95c2ad0381b9b324f8bbf4c388b5dafb0 /src
parent1d13f7a666149c0c863782c064ac6ba25b8c592f (diff)
[video_core] Fix missing draws caused by implicit render pass state (#3355)
Some blit paths could be recorded while a render pass was still active, which is undefined behavior in Vulkan. Depending on driver behavior and timing, this could result in intermittent visual artifacts, incomplete frames being presented, or issues with capture paths. Explicitly request an outside render pass operation context before issuing blit commands, ensuring all rendering has fully completed before presentation or readback. This does not change intended rendering output, but fixes a class of synchronization and command buffer state issues. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3355 Reviewed-by: DraVee <dravee@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index 3b47570a7e..d1e607e75f 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -193,10 +193,13 @@ void RendererVulkan::Composite(std::span<const Tegra::FramebufferConfig> framebu
RenderScreenshot(framebuffers);
Frame* frame = present_manager.GetRenderFrame();
+
+ scheduler.RequestOutsideRenderPassOperationContext();
blit_swapchain.DrawToFrame(rasterizer, frame, framebuffers,
render_window.GetFramebufferLayout(), swapchain.GetImageCount(),
swapchain.GetImageViewFormat());
scheduler.Flush(*frame->render_ready);
+
present_manager.Present(frame);
gpu.RendererFrameEndNotify();
@@ -303,6 +306,7 @@ void RendererVulkan::RenderAppletCaptureLayer(
VideoCore::Capture::Layout, *applet_frame.image_view, CaptureFormat);
}
+ scheduler.RequestOutsideRenderPassOperationContext();
blit_applet.DrawToFrame(rasterizer, &applet_frame, framebuffers, VideoCore::Capture::Layout, 1,
CaptureFormat);
}