From 559eb0a488b651397802066878aebdbd65b42baf Mon Sep 17 00:00:00 2001 From: Briar <205427297+icy-briar@users.noreply.github.com> Date: Fri, 2 May 2025 18:42:58 +0000 Subject: renderer_vulkan: Use raw surface handles and improve release logic (#75) Should fix or at least lessen the crashes when leaving runtime emulation on both Android / PC Also, may have improved the time required to leave the game Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/75 Co-authored-by: Briar <205427297+icy-briar@users.noreply.github.com> Co-committed-by: Briar <205427297+icy-briar@users.noreply.github.com> --- src/video_core/renderer_vulkan/renderer_vulkan.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/video_core/renderer_vulkan/renderer_vulkan.cpp') diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index ebc50290a9..32a207bc26 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -120,12 +120,13 @@ RendererVulkan::RendererVulkan(Core::Frontend::EmuWindow& emu_window, // Create surface surface(CreateSurface(instance, render_window.GetWindowInfo())), managed_surface(MakeManagedSurface(surface, instance, dld)), - device(CreateDevice(instance, dld, *surface)), memory_allocator(device), state_tracker(), + device(CreateDevice(instance, dld, *surface)), + memory_allocator(device), state_tracker(), scheduler(device, state_tracker), swapchain(*surface, device, scheduler, render_window.GetFramebufferLayout().width, render_window.GetFramebufferLayout().height), present_manager(instance, render_window, device, memory_allocator, scheduler, swapchain, - surface), + *surface), blit_swapchain(device_memory, device, memory_allocator, present_manager, scheduler, PresentFiltersForDisplay), blit_capture(device_memory, device, memory_allocator, present_manager, scheduler, @@ -136,11 +137,19 @@ RendererVulkan::RendererVulkan(Core::Frontend::EmuWindow& emu_window, scheduler), hybrid_memory(std::make_unique(device, memory_allocator)), applet_frame() { - if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { + + if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { turbo_mode.emplace(instance, dld); scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); } + // Release ownership from the old instance and surface + instance.release(); + surface.release(); + if (Settings::values.renderer_debug) { + debug_messenger.release(); + } + // Initialize HybridMemory system if (Settings::values.use_gpu_memory_manager.GetValue()) { #if defined(__linux__) || defined(__ANDROID__) || defined(_WIN32) -- cgit v1.2.3