mirror of
https://github.com/godotengine/godot.git
synced 2025-12-08 06:09:55 +00:00
Fix crash when using ANGLE OpenGL on Windows.
This commit is contained in:
parent
e6aa06d3de
commit
69401d6eb1
2 changed files with 21 additions and 11 deletions
|
|
@ -5814,16 +5814,16 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
rect_changed = true;
|
rect_changed = true;
|
||||||
}
|
}
|
||||||
#if defined(RD_ENABLED)
|
#if defined(RD_ENABLED)
|
||||||
if (window.create_completed && rendering_context && window.context_created) {
|
if (window.create_completed && rendering_context && window.rendering_context_window_created) {
|
||||||
// Note: Trigger resize event to update swapchains when window is minimized/restored, even if size is not changed.
|
// 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);
|
rendering_context->window_set_size(window_id, window.width, window.height);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(GLES3_ENABLED)
|
#if defined(GLES3_ENABLED)
|
||||||
if (window.create_completed && gl_manager_native) {
|
if (window.create_completed && gl_manager_native && window.gl_native_window_created) {
|
||||||
gl_manager_native->window_resize(window_id, window.width, window.height);
|
gl_manager_native->window_resize(window_id, window.width, window.height);
|
||||||
}
|
}
|
||||||
if (window.create_completed && gl_manager_angle) {
|
if (window.create_completed && gl_manager_angle && window.gl_angle_window_created) {
|
||||||
gl_manager_angle->window_resize(window_id, window.width, window.height);
|
gl_manager_angle->window_resize(window_id, window.width, window.height);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -6632,7 +6632,7 @@ Error DisplayServerWindows::_create_rendering_context_window(WindowID p_window_i
|
||||||
ERR_FAIL_COND_V_MSG(err != OK, err, vformat("Failed to create %s window.", rendering_driver));
|
ERR_FAIL_COND_V_MSG(err != OK, err, vformat("Failed to create %s window.", rendering_driver));
|
||||||
|
|
||||||
rendering_context->window_set_size(p_window_id, wd.width, wd.height);
|
rendering_context->window_set_size(p_window_id, wd.width, wd.height);
|
||||||
wd.context_created = true;
|
wd.rendering_context_window_created = true;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
@ -6641,10 +6641,10 @@ void DisplayServerWindows::_destroy_rendering_context_window(WindowID p_window_i
|
||||||
DEV_ASSERT(rendering_context != nullptr);
|
DEV_ASSERT(rendering_context != nullptr);
|
||||||
|
|
||||||
WindowData &wd = windows[p_window_id];
|
WindowData &wd = windows[p_window_id];
|
||||||
DEV_ASSERT(wd.context_created);
|
DEV_ASSERT(wd.rendering_context_window_created);
|
||||||
|
|
||||||
rendering_context->window_destroy(p_window_id);
|
rendering_context->window_destroy(p_window_id);
|
||||||
wd.context_created = false;
|
wd.rendering_context_window_created = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -6652,12 +6652,20 @@ void DisplayServerWindows::_destroy_rendering_context_window(WindowID p_window_i
|
||||||
Error DisplayServerWindows::_create_gl_window(WindowID p_window_id) {
|
Error DisplayServerWindows::_create_gl_window(WindowID p_window_id) {
|
||||||
if (gl_manager_native) {
|
if (gl_manager_native) {
|
||||||
WindowData &wd = windows[p_window_id];
|
WindowData &wd = windows[p_window_id];
|
||||||
return gl_manager_native->window_create(p_window_id, wd.hWnd, hInstance, wd.width, wd.height);
|
|
||||||
|
Error err = gl_manager_native->window_create(p_window_id, wd.hWnd, hInstance, wd.width, wd.height);
|
||||||
|
ERR_FAIL_COND_V_MSG(err != OK, err, "Failed to create native OpenGL window.");
|
||||||
|
|
||||||
|
wd.gl_native_window_created = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gl_manager_angle) {
|
if (gl_manager_angle) {
|
||||||
WindowData &wd = windows[p_window_id];
|
WindowData &wd = windows[p_window_id];
|
||||||
return gl_manager_angle->window_create(p_window_id, nullptr, wd.hWnd, wd.width, wd.height);
|
|
||||||
|
Error err = gl_manager_angle->window_create(p_window_id, nullptr, wd.hWnd, wd.width, wd.height);
|
||||||
|
ERR_FAIL_COND_V_MSG(err != OK, err, "Failed to create ANGLE OpenGL window.");
|
||||||
|
|
||||||
|
wd.gl_angle_window_created = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|
@ -7408,7 +7416,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
gl_manager_native = nullptr;
|
gl_manager_native = nullptr;
|
||||||
windows.erase(MAIN_WINDOW_ID);
|
windows.erase(MAIN_WINDOW_ID);
|
||||||
r_error = ERR_UNAVAILABLE;
|
r_error = ERR_UNAVAILABLE;
|
||||||
ERR_FAIL_MSG("Failed to create an OpenGL window.");
|
return;
|
||||||
}
|
}
|
||||||
RasterizerGLES3::make_current(true);
|
RasterizerGLES3::make_current(true);
|
||||||
}
|
}
|
||||||
|
|
@ -7418,7 +7426,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
||||||
gl_manager_angle = nullptr;
|
gl_manager_angle = nullptr;
|
||||||
windows.erase(MAIN_WINDOW_ID);
|
windows.erase(MAIN_WINDOW_ID);
|
||||||
r_error = ERR_UNAVAILABLE;
|
r_error = ERR_UNAVAILABLE;
|
||||||
ERR_FAIL_MSG("Failed to create an OpenGL window.");
|
return;
|
||||||
}
|
}
|
||||||
RasterizerGLES3::make_current(false);
|
RasterizerGLES3::make_current(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,9 @@ class DisplayServerWindows : public DisplayServer {
|
||||||
bool always_on_top = false;
|
bool always_on_top = false;
|
||||||
bool no_focus = false;
|
bool no_focus = false;
|
||||||
bool exclusive = false;
|
bool exclusive = false;
|
||||||
bool context_created = false;
|
bool rendering_context_window_created = false;
|
||||||
|
bool gl_native_window_created = false;
|
||||||
|
bool gl_angle_window_created = false;
|
||||||
bool mpass = false;
|
bool mpass = false;
|
||||||
bool sharp_corners = false;
|
bool sharp_corners = false;
|
||||||
bool hide_from_capture = false;
|
bool hide_from_capture = false;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue