From d7f023ab732655a235155998f92a24b9812d2927 Mon Sep 17 00:00:00 2001 From: Alvin Wong Date: Tue, 16 Jul 2024 16:50:45 +0800 Subject: [PATCH 1/2] Windows: Do not attempt to resize surface before it is created `WM_WINDOWPOSCHANGED` may be received before `CreateWindowExW` has even returned, when the window's rendering context or OpenGL context hasn't been created yet. --- platform/windows/display_server_windows.cpp | 7 ++++--- platform/windows/display_server_windows.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 750e8bb54cf4..be1e7ed94caf 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -4686,16 +4686,16 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA rect_changed = true; } #if defined(RD_ENABLED) - if (rendering_context && window.context_created) { + if (window.create_completed && rendering_context && window.context_created) { // Note: Trigger resize event to update swapchains when window is minimized/restored, even if size is not changed. rendering_context->window_set_size(window_id, window.width, window.height); } #endif #if defined(GLES3_ENABLED) - if (gl_manager_native) { + if (window.create_completed && gl_manager_native) { gl_manager_native->window_resize(window_id, window.width, window.height); } - if (gl_manager_angle) { + if (window.create_completed && gl_manager_angle) { gl_manager_angle->window_resize(window_id, window.width, window.height); } #endif @@ -5403,6 +5403,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, SetWindowPos(wd.hWnd, HWND_TOP, srect.position.x, srect.position.y, srect.size.width, srect.size.height, SWP_NOZORDER | SWP_NOACTIVATE); } + wd.create_completed = true; window_id_counter++; } diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index c2f4de7d8114..2c85a6222163 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -385,6 +385,7 @@ class DisplayServerWindows : public DisplayServer { Vector mpath; + bool create_completed = false; bool pre_fs_valid = false; RECT pre_fs_rect; bool maximized = false; From a1a0acff7c7eaddb0743f47fbcd73ffb081e0577 Mon Sep 17 00:00:00 2001 From: Alvin Wong Date: Tue, 16 Jul 2024 16:58:27 +0800 Subject: [PATCH 2/2] Windows: Update ANGLE surface size when window is resized ANGLE needs to be told to resize the DXGI swap chain using `eglWaitNative`. Otherwise the resize will only happen in `eglSwapBuffers`, which causes some janky stretching during window resize. --- platform/windows/gl_manager_windows_angle.cpp | 5 +++++ platform/windows/gl_manager_windows_angle.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/windows/gl_manager_windows_angle.cpp b/platform/windows/gl_manager_windows_angle.cpp index 3086edc7f23c..c52564676fc5 100644 --- a/platform/windows/gl_manager_windows_angle.cpp +++ b/platform/windows/gl_manager_windows_angle.cpp @@ -67,4 +67,9 @@ Vector GLManagerANGLE_Windows::_get_platform_context_attribs() const { return ret; } +void GLManagerANGLE_Windows::window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height) { + window_make_current(p_window_id); + eglWaitNative(EGL_CORE_NATIVE_ENGINE); +} + #endif // WINDOWS_ENABLED && GLES3_ENABLED diff --git a/platform/windows/gl_manager_windows_angle.h b/platform/windows/gl_manager_windows_angle.h index d8dc651cfd45..f43a6fbe022a 100644 --- a/platform/windows/gl_manager_windows_angle.h +++ b/platform/windows/gl_manager_windows_angle.h @@ -50,7 +50,7 @@ class GLManagerANGLE_Windows : public EGLManager { virtual Vector _get_platform_context_attribs() const override; public: - void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height) {} + void window_resize(DisplayServer::WindowID p_window_id, int p_width, int p_height); GLManagerANGLE_Windows(){}; ~GLManagerANGLE_Windows(){};