diff --git a/src/common/window_info.cpp b/src/common/window_info.cpp index 5176dad62..961638fc8 100644 --- a/src/common/window_info.cpp +++ b/src/common/window_info.cpp @@ -2,6 +2,21 @@ #include "common/log.h" Log_SetChannel(WindowInfo); +void WindowInfo::SetSurfaceless() +{ + type = Type::Surfaceless; + window_handle = nullptr; + surface_width = 0; + surface_height = 0; + surface_refresh_rate = 0.0f; + surface_scale = 1.0f; + surface_format = SurfaceFormat::None; + +#ifdef __APPLE__ + surface_handle = nullptr; +#endif +} + #if defined(_WIN32) #include "common/windows_headers.h" diff --git a/src/common/window_info.h b/src/common/window_info.h index 342d316c4..11216a432 100644 --- a/src/common/window_info.h +++ b/src/common/window_info.h @@ -39,5 +39,8 @@ struct WindowInfo void* surface_handle = nullptr; #endif + // Changes the window to be surfaceless (i.e. no handle/size/etc). + void SetSurfaceless(); + static bool QueryRefreshRateForWindow(const WindowInfo& wi, float* refresh_rate); }; diff --git a/src/frontend-common/d3d11_host_display.cpp b/src/frontend-common/d3d11_host_display.cpp index 962c82fc1..15143e6c2 100644 --- a/src/frontend-common/d3d11_host_display.cpp +++ b/src/frontend-common/d3d11_host_display.cpp @@ -459,6 +459,7 @@ bool D3D11HostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) void D3D11HostDisplay::DestroyRenderSurface() { + m_window_info.SetSurfaceless(); if (IsFullscreen()) SetFullscreen(false, 0, 0, 0.0f); diff --git a/src/frontend-common/d3d12_host_display.cpp b/src/frontend-common/d3d12_host_display.cpp index 46341c229..b3c61a6b2 100644 --- a/src/frontend-common/d3d12_host_display.cpp +++ b/src/frontend-common/d3d12_host_display.cpp @@ -348,6 +348,8 @@ bool D3D12HostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) void D3D12HostDisplay::DestroyRenderSurface() { + m_window_info.SetSurfaceless(); + // For some reason if we don't execute the command list here, the swap chain is in use.. not sure where. g_d3d12_context->ExecuteCommandList(true); diff --git a/src/frontend-common/opengl_host_display.cpp b/src/frontend-common/opengl_host_display.cpp index 154e2f5af..d73ee6906 100644 --- a/src/frontend-common/opengl_host_display.cpp +++ b/src/frontend-common/opengl_host_display.cpp @@ -408,7 +408,7 @@ void OpenGLHostDisplay::DestroyRenderSurface() if (!m_gl_context) return; - m_window_info = {}; + m_window_info.SetSurfaceless(); if (!m_gl_context->ChangeSurface(m_window_info)) Log_ErrorPrintf("Failed to switch to surfaceless"); } diff --git a/src/frontend-common/vulkan_host_display.cpp b/src/frontend-common/vulkan_host_display.cpp index a87deb5f7..bf8d0af72 100644 --- a/src/frontend-common/vulkan_host_display.cpp +++ b/src/frontend-common/vulkan_host_display.cpp @@ -130,7 +130,7 @@ HostDisplay::AdapterAndModeList VulkanHostDisplay::GetAdapterAndModeList() void VulkanHostDisplay::DestroyRenderSurface() { - m_window_info = {}; + m_window_info.SetSurfaceless(); g_vulkan_context->WaitForGPUIdle(); m_swap_chain.reset(); }