From 0c389789f306a40eea06cf65933b572fee232588 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 27 Apr 2023 16:06:25 +1000 Subject: [PATCH] GS: Fix hang when switching renderer while fullscreen --- pcsx2/GS/GS.cpp | 1 + pcsx2/GS/Renderers/Common/GSDevice.cpp | 6 ------ pcsx2/GS/Renderers/Common/GSDevice.h | 1 - pcsx2/GS/Renderers/DX11/GSDevice11.cpp | 2 -- pcsx2/GS/Renderers/DX12/GSDevice12.cpp | 2 -- pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm | 1 - pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp | 3 --- pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp | 6 ------ 8 files changed, 1 insertion(+), 21 deletions(-) diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index a624858d22..d7992dd814 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -359,6 +359,7 @@ void GSclose() { CloseGSRenderer(); CloseGSDevice(true); + Host::ReleaseRenderWindow(); } void GSreset(bool hardware_reset) diff --git a/pcsx2/GS/Renderers/Common/GSDevice.cpp b/pcsx2/GS/Renderers/Common/GSDevice.cpp index 78e3d78968..6b7fa3fef1 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.cpp +++ b/pcsx2/GS/Renderers/Common/GSDevice.cpp @@ -216,12 +216,6 @@ bool GSDevice::AcquireWindow(bool recreate_window) return true; } -void GSDevice::ReleaseWindow() -{ - Host::ReleaseRenderWindow(); - m_window_info = WindowInfo(); -} - bool GSDevice::GetHostRefreshRate(float* refresh_rate) { if (m_window_info.surface_refresh_rate > 0.0f) diff --git a/pcsx2/GS/Renderers/Common/GSDevice.h b/pcsx2/GS/Renderers/Common/GSDevice.h index e1ce9b9d77..8bacadb0e8 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.h +++ b/pcsx2/GS/Renderers/Common/GSDevice.h @@ -780,7 +780,6 @@ protected: FeatureSupport m_features; bool AcquireWindow(bool recreate_window); - void ReleaseWindow(); virtual GSTexture* CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) = 0; GSTexture* FetchSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format, bool clear, bool prefer_reuse); diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index 0dd3ed038b..3ecd5cedde 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -493,7 +493,6 @@ void GSDevice11::Destroy() { GSDevice::Destroy(); DestroySwapChain(); - ReleaseWindow(); DestroyTimestampQueries(); m_convert = {}; @@ -769,7 +768,6 @@ bool GSDevice11::UpdateWindow() if (m_window_info.type != WindowInfo::Type::Surfaceless && !CreateSwapChain()) { Console.WriteLn("Failed to create swap chain on updated window"); - ReleaseWindow(); return false; } diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp index e5fd913180..bfcb11c440 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp @@ -218,7 +218,6 @@ void GSDevice12::Destroy() ExecuteCommandList(true); DestroyResources(); DestroySwapChain(); - ReleaseWindow(); g_d3d12_context->Destroy(); } } @@ -432,7 +431,6 @@ bool GSDevice12::UpdateWindow() if (m_window_info.type != WindowInfo::Type::Surfaceless && !CreateSwapChain()) { Console.WriteLn("Failed to create swap chain on updated window"); - ReleaseWindow(); return false; } diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm index 6bef4a1a3e..be1c79ed84 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm @@ -1170,7 +1170,6 @@ void GSDeviceMTL::Destroy() GSDevice::Destroy(); GSDeviceMTL::DestroySurface(); - ReleaseWindow(); m_queue = nullptr; m_dev.Reset(); }} diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp index 10be0cce33..e40d28392d 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp @@ -551,8 +551,6 @@ void GSDeviceOGL::Destroy() m_gl_context->DoneCurrent(); m_gl_context.reset(); - - ReleaseWindow(); } } @@ -673,7 +671,6 @@ bool GSDeviceOGL::UpdateWindow() if (!m_gl_context->ChangeSurface(m_window_info)) { Console.Error("Failed to change surface"); - ReleaseWindow(); return false; } diff --git a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp index 7db678dffa..8aab86eac1 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp @@ -257,7 +257,6 @@ void GSDeviceVK::Destroy() g_vulkan_context->WaitForGPUIdle(); m_swap_chain.reset(); - ReleaseWindow(); Vulkan::ShaderCache::Destroy(); Vulkan::Context::Destroy(); @@ -295,7 +294,6 @@ bool GSDeviceVK::UpdateWindow() if (surface == VK_NULL_HANDLE) { Console.Error("Failed to create new surface for swap chain"); - ReleaseWindow(); return false; } @@ -304,7 +302,6 @@ bool GSDeviceVK::UpdateWindow() { Console.Error("Failed to create swap chain"); Vulkan::SwapChain::DestroyVulkanSurface(g_vulkan_context->GetVulkanInstance(), &m_window_info, surface); - ReleaseWindow(); return false; } @@ -572,8 +569,6 @@ bool GSDeviceVK::CreateDeviceAndSwapChain() if (!AcquireWindow(true)) return false; - ScopedGuard window_cleanup = [this]() { ReleaseWindow(); }; - VkInstance instance = Vulkan::Context::CreateVulkanInstance(m_window_info, enable_debug_utils, enable_validation_layer); if (instance == VK_NULL_HANDLE) @@ -668,7 +663,6 @@ bool GSDeviceVK::CreateDeviceAndSwapChain() surface_cleanup.Cancel(); instance_cleanup.Cancel(); - window_cleanup.Cancel(); library_cleanup.Cancel(); // Render a frame as soon as possible to clear out whatever was previously being displayed.