Browse Source

Polish interaction between windowing, input and rendering

- Adapt GL make/release API to the current architecture.
- Fix DisplayServer being locked while dispatching input (prevent deadlocks).
Pedro J. Estébanez 1 year ago
parent
commit
c28f5901c7

+ 0 - 15
drivers/egl/egl_manager.cpp

@@ -260,21 +260,6 @@ void EGLManager::release_current() {
 	eglMakeCurrent(current_display.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 	eglMakeCurrent(current_display.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 }
 }
 
 
-void EGLManager::make_current() {
-	if (!current_window) {
-		return;
-	}
-
-	if (!current_window->initialized) {
-		WARN_PRINT("Current OpenGL window is uninitialized!");
-		return;
-	}
-
-	GLDisplay &current_display = displays[current_window->gldisplay_id];
-
-	eglMakeCurrent(current_display.egl_display, current_window->egl_surface, current_window->egl_surface, current_display.egl_context);
-}
-
 void EGLManager::swap_buffers() {
 void EGLManager::swap_buffers() {
 	if (!current_window) {
 	if (!current_window) {
 		return;
 		return;

+ 0 - 1
drivers/egl/egl_manager.h

@@ -98,7 +98,6 @@ public:
 	void window_destroy(DisplayServer::WindowID p_window_id);
 	void window_destroy(DisplayServer::WindowID p_window_id);
 
 
 	void release_current();
 	void release_current();
-	void make_current();
 	void swap_buffers();
 	void swap_buffers();
 
 
 	void window_make_current(DisplayServer::WindowID p_window_id);
 	void window_make_current(DisplayServer::WindowID p_window_id);

+ 0 - 8
platform/linuxbsd/wayland/display_server_wayland.cpp

@@ -1174,14 +1174,6 @@ void DisplayServerWayland::release_rendering_thread() {
 #endif
 #endif
 }
 }
 
 
-void DisplayServerWayland::make_rendering_thread() {
-#ifdef GLES3_ENABLED
-	if (egl_manager) {
-		egl_manager->make_current();
-	}
-#endif
-}
-
 void DisplayServerWayland::swap_buffers() {
 void DisplayServerWayland::swap_buffers() {
 #ifdef GLES3_ENABLED
 #ifdef GLES3_ENABLED
 	if (egl_manager) {
 	if (egl_manager) {

+ 0 - 1
platform/linuxbsd/wayland/display_server_wayland.h

@@ -276,7 +276,6 @@ public:
 	virtual void process_events() override;
 	virtual void process_events() override;
 
 
 	virtual void release_rendering_thread() override;
 	virtual void release_rendering_thread() override;
-	virtual void make_rendering_thread() override;
 	virtual void swap_buffers() override;
 	virtual void swap_buffers() override;
 
 
 	virtual void set_context(Context p_context) override;
 	virtual void set_context(Context p_context) override;

+ 3 - 12
platform/linuxbsd/x11/display_server_x11.cpp

@@ -4268,7 +4268,7 @@ bool DisplayServerX11::_window_focus_check() {
 }
 }
 
 
 void DisplayServerX11::process_events() {
 void DisplayServerX11::process_events() {
-	_THREAD_SAFE_METHOD_
+	_THREAD_SAFE_LOCK_
 
 
 #ifdef DISPLAY_SERVER_X11_DEBUG_LOGS_ENABLED
 #ifdef DISPLAY_SERVER_X11_DEBUG_LOGS_ENABLED
 	static int frame = 0;
 	static int frame = 0;
@@ -5097,6 +5097,8 @@ void DisplayServerX11::process_events() {
 		*/
 		*/
 	}
 	}
 
 
+	_THREAD_SAFE_UNLOCK_
+
 	Input::get_singleton()->flush_buffered_events();
 	Input::get_singleton()->flush_buffered_events();
 }
 }
 
 
@@ -5111,17 +5113,6 @@ void DisplayServerX11::release_rendering_thread() {
 #endif
 #endif
 }
 }
 
 
-void DisplayServerX11::make_rendering_thread() {
-#if defined(GLES3_ENABLED)
-	if (gl_manager) {
-		gl_manager->make_current();
-	}
-	if (gl_manager_egl) {
-		gl_manager_egl->make_current();
-	}
-#endif
-}
-
 void DisplayServerX11::swap_buffers() {
 void DisplayServerX11::swap_buffers() {
 #if defined(GLES3_ENABLED)
 #if defined(GLES3_ENABLED)
 	if (gl_manager) {
 	if (gl_manager) {

+ 0 - 1
platform/linuxbsd/x11/display_server_x11.h

@@ -526,7 +526,6 @@ public:
 	virtual void process_events() override;
 	virtual void process_events() override;
 
 
 	virtual void release_rendering_thread() override;
 	virtual void release_rendering_thread() override;
-	virtual void make_rendering_thread() override;
 	virtual void swap_buffers() override;
 	virtual void swap_buffers() override;
 
 
 	virtual void set_context(Context p_context) override;
 	virtual void set_context(Context p_context) override;

+ 0 - 14
platform/linuxbsd/x11/gl_manager_x11.cpp

@@ -311,20 +311,6 @@ void GLManager_X11::window_make_current(DisplayServer::WindowID p_window_id) {
 	_internal_set_current_window(&win);
 	_internal_set_current_window(&win);
 }
 }
 
 
-void GLManager_X11::make_current() {
-	if (!_current_window) {
-		return;
-	}
-	if (!_current_window->in_use) {
-		WARN_PRINT("current window not in use!");
-		return;
-	}
-	const GLDisplay &disp = get_current_display();
-	if (!glXMakeCurrent(_x_windisp.x11_display, _x_windisp.x11_window, disp.context->glx_context)) {
-		ERR_PRINT("glXMakeCurrent failed");
-	}
-}
-
 void GLManager_X11::swap_buffers() {
 void GLManager_X11::swap_buffers() {
 	if (!_current_window) {
 	if (!_current_window) {
 		return;
 		return;

+ 0 - 1
platform/linuxbsd/x11/gl_manager_x11.h

@@ -117,7 +117,6 @@ 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);
 
 
 	void release_current();
 	void release_current();
-	void make_current();
 	void swap_buffers();
 	void swap_buffers();
 
 
 	void window_make_current(DisplayServer::WindowID p_window_id);
 	void window_make_current(DisplayServer::WindowID p_window_id);

+ 0 - 1
platform/macos/display_server_macos.h

@@ -426,7 +426,6 @@ public:
 	virtual void force_process_and_drop_events() override;
 	virtual void force_process_and_drop_events() override;
 
 
 	virtual void release_rendering_thread() override;
 	virtual void release_rendering_thread() override;
-	virtual void make_rendering_thread() override;
 	virtual void swap_buffers() override;
 	virtual void swap_buffers() override;
 
 
 	virtual void set_native_icon(const String &p_filename) override;
 	virtual void set_native_icon(const String &p_filename) override;

+ 13 - 5
platform/macos/display_server_macos.mm

@@ -358,7 +358,6 @@ void DisplayServerMacOS::_dispatch_input_events(const Ref<InputEvent> &p_event)
 }
 }
 
 
 void DisplayServerMacOS::_dispatch_input_event(const Ref<InputEvent> &p_event) {
 void DisplayServerMacOS::_dispatch_input_event(const Ref<InputEvent> &p_event) {
-	_THREAD_SAFE_METHOD_
 	if (!in_dispatch_input_event) {
 	if (!in_dispatch_input_event) {
 		in_dispatch_input_event = true;
 		in_dispatch_input_event = true;
 
 
@@ -2986,7 +2985,7 @@ Key DisplayServerMacOS::keyboard_get_label_from_physical(Key p_keycode) const {
 }
 }
 
 
 void DisplayServerMacOS::process_events() {
 void DisplayServerMacOS::process_events() {
-	_THREAD_SAFE_METHOD_
+	_THREAD_SAFE_LOCK_
 
 
 	while (true) {
 	while (true) {
 		NSEvent *event = [NSApp
 		NSEvent *event = [NSApp
@@ -3019,7 +3018,9 @@ void DisplayServerMacOS::process_events() {
 
 
 	if (!drop_events) {
 	if (!drop_events) {
 		_process_key_events();
 		_process_key_events();
+		_THREAD_SAFE_UNLOCK_
 		Input::get_singleton()->flush_buffered_events();
 		Input::get_singleton()->flush_buffered_events();
+		_THREAD_SAFE_LOCK_
 	}
 	}
 
 
 	for (KeyValue<WindowID, WindowData> &E : windows) {
 	for (KeyValue<WindowID, WindowData> &E : windows) {
@@ -3045,6 +3046,8 @@ void DisplayServerMacOS::process_events() {
 			}
 			}
 		}
 		}
 	}
 	}
+
+	_THREAD_SAFE_UNLOCK_
 }
 }
 
 
 void DisplayServerMacOS::force_process_and_drop_events() {
 void DisplayServerMacOS::force_process_and_drop_events() {
@@ -3056,9 +3059,14 @@ void DisplayServerMacOS::force_process_and_drop_events() {
 }
 }
 
 
 void DisplayServerMacOS::release_rendering_thread() {
 void DisplayServerMacOS::release_rendering_thread() {
-}
-
-void DisplayServerMacOS::make_rendering_thread() {
+#if defined(GLES3_ENABLED)
+	if (gl_manager_angle) {
+		gl_manager_angle->release_current();
+	}
+	if (gl_manager_legacy) {
+		gl_manager_legacy->release_current();
+	}
+#endif
 }
 }
 
 
 void DisplayServerMacOS::swap_buffers() {
 void DisplayServerMacOS::swap_buffers() {

+ 0 - 1
platform/macos/gl_manager_macos_legacy.h

@@ -73,7 +73,6 @@ 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);
 
 
 	void release_current();
 	void release_current();
-	void make_current();
 	void swap_buffers();
 	void swap_buffers();
 
 
 	void window_make_current(DisplayServer::WindowID p_window_id);
 	void window_make_current(DisplayServer::WindowID p_window_id);

+ 1 - 12
platform/macos/gl_manager_macos_legacy.mm

@@ -117,6 +117,7 @@ void GLManagerLegacy_MacOS::release_current() {
 	}
 	}
 
 
 	[NSOpenGLContext clearCurrentContext];
 	[NSOpenGLContext clearCurrentContext];
+	current_window = DisplayServer::INVALID_WINDOW_ID;
 }
 }
 
 
 void GLManagerLegacy_MacOS::window_make_current(DisplayServer::WindowID p_window_id) {
 void GLManagerLegacy_MacOS::window_make_current(DisplayServer::WindowID p_window_id) {
@@ -133,18 +134,6 @@ void GLManagerLegacy_MacOS::window_make_current(DisplayServer::WindowID p_window
 	current_window = p_window_id;
 	current_window = p_window_id;
 }
 }
 
 
-void GLManagerLegacy_MacOS::make_current() {
-	if (current_window == DisplayServer::INVALID_WINDOW_ID) {
-		return;
-	}
-	if (!windows.has(current_window)) {
-		return;
-	}
-
-	GLWindow &win = windows[current_window];
-	[win.context makeCurrentContext];
-}
-
 void GLManagerLegacy_MacOS::swap_buffers() {
 void GLManagerLegacy_MacOS::swap_buffers() {
 	GLWindow &win = windows[current_window];
 	GLWindow &win = windows[current_window];
 	[win.context flushBuffer];
 	[win.context flushBuffer];

+ 12 - 5
platform/windows/display_server_windows.cpp

@@ -2962,7 +2962,7 @@ String DisplayServerWindows::keyboard_get_layout_name(int p_index) const {
 }
 }
 
 
 void DisplayServerWindows::process_events() {
 void DisplayServerWindows::process_events() {
-	_THREAD_SAFE_METHOD_
+	_THREAD_SAFE_LOCK_
 
 
 	MSG msg;
 	MSG msg;
 
 
@@ -2977,7 +2977,10 @@ void DisplayServerWindows::process_events() {
 
 
 	if (!drop_events) {
 	if (!drop_events) {
 		_process_key_events();
 		_process_key_events();
+		_THREAD_SAFE_UNLOCK_
 		Input::get_singleton()->flush_buffered_events();
 		Input::get_singleton()->flush_buffered_events();
+	} else {
+		_THREAD_SAFE_UNLOCK_
 	}
 	}
 }
 }
 
 
@@ -2990,9 +2993,14 @@ void DisplayServerWindows::force_process_and_drop_events() {
 }
 }
 
 
 void DisplayServerWindows::release_rendering_thread() {
 void DisplayServerWindows::release_rendering_thread() {
-}
-
-void DisplayServerWindows::make_rendering_thread() {
+#if defined(GLES3_ENABLED)
+	if (gl_manager_angle) {
+		gl_manager_angle->release_current();
+	}
+	if (gl_manager_native) {
+		gl_manager_native->release_current();
+	}
+#endif
 }
 }
 
 
 void DisplayServerWindows::swap_buffers() {
 void DisplayServerWindows::swap_buffers() {
@@ -3433,7 +3441,6 @@ void DisplayServerWindows::_dispatch_input_events(const Ref<InputEvent> &p_event
 }
 }
 
 
 void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event) {
 void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event) {
-	_THREAD_SAFE_METHOD_
 	if (in_dispatch_input_event) {
 	if (in_dispatch_input_event) {
 		return;
 		return;
 	}
 	}

+ 0 - 1
platform/windows/display_server_windows.h

@@ -679,7 +679,6 @@ public:
 	virtual void force_process_and_drop_events() override;
 	virtual void force_process_and_drop_events() override;
 
 
 	virtual void release_rendering_thread() override;
 	virtual void release_rendering_thread() override;
-	virtual void make_rendering_thread() override;
 	virtual void swap_buffers() override;
 	virtual void swap_buffers() override;
 
 
 	virtual void set_native_icon(const String &p_filename) override;
 	virtual void set_native_icon(const String &p_filename) override;

+ 3 - 21
platform/windows/gl_manager_windows_native.cpp

@@ -427,10 +427,6 @@ Error GLManagerNative_Windows::window_create(DisplayServer::WindowID p_window_id
 	return OK;
 	return OK;
 }
 }
 
 
-void GLManagerNative_Windows::_internal_set_current_window(GLWindow *p_win) {
-	_current_window = p_win;
-}
-
 void GLManagerNative_Windows::window_destroy(DisplayServer::WindowID p_window_id) {
 void GLManagerNative_Windows::window_destroy(DisplayServer::WindowID p_window_id) {
 	GLWindow &win = get_window(p_window_id);
 	GLWindow &win = get_window(p_window_id);
 	if (_current_window == &win) {
 	if (_current_window == &win) {
@@ -447,6 +443,8 @@ void GLManagerNative_Windows::release_current() {
 	if (!gd_wglMakeCurrent(_current_window->hDC, nullptr)) {
 	if (!gd_wglMakeCurrent(_current_window->hDC, nullptr)) {
 		ERR_PRINT("Could not detach OpenGL context from window marked current: " + format_error_message(GetLastError()));
 		ERR_PRINT("Could not detach OpenGL context from window marked current: " + format_error_message(GetLastError()));
 	}
 	}
+
+	_current_window = nullptr;
 }
 }
 
 
 void GLManagerNative_Windows::window_make_current(DisplayServer::WindowID p_window_id) {
 void GLManagerNative_Windows::window_make_current(DisplayServer::WindowID p_window_id) {
@@ -467,17 +465,7 @@ void GLManagerNative_Windows::window_make_current(DisplayServer::WindowID p_wind
 		ERR_PRINT("Could not switch OpenGL context to other window: " + format_error_message(GetLastError()));
 		ERR_PRINT("Could not switch OpenGL context to other window: " + format_error_message(GetLastError()));
 	}
 	}
 
 
-	_internal_set_current_window(&win);
-}
-
-void GLManagerNative_Windows::make_current() {
-	if (!_current_window) {
-		return;
-	}
-	const GLDisplay &disp = get_current_display();
-	if (!gd_wglMakeCurrent(_current_window->hDC, disp.hRC)) {
-		ERR_PRINT("Could not switch OpenGL context to window marked current: " + format_error_message(GetLastError()));
-	}
+	_current_window = &win;
 }
 }
 
 
 void GLManagerNative_Windows::swap_buffers() {
 void GLManagerNative_Windows::swap_buffers() {
@@ -491,7 +479,6 @@ Error GLManagerNative_Windows::initialize() {
 
 
 void GLManagerNative_Windows::set_use_vsync(DisplayServer::WindowID p_window_id, bool p_use) {
 void GLManagerNative_Windows::set_use_vsync(DisplayServer::WindowID p_window_id, bool p_use) {
 	GLWindow &win = get_window(p_window_id);
 	GLWindow &win = get_window(p_window_id);
-	GLWindow *current = _current_window;
 
 
 	if (&win != _current_window) {
 	if (&win != _current_window) {
 		window_make_current(p_window_id);
 		window_make_current(p_window_id);
@@ -506,11 +493,6 @@ void GLManagerNative_Windows::set_use_vsync(DisplayServer::WindowID p_window_id,
 	} else {
 	} else {
 		WARN_PRINT("Could not set V-Sync mode. V-Sync is not supported.");
 		WARN_PRINT("Could not set V-Sync mode. V-Sync is not supported.");
 	}
 	}
-
-	if (current != _current_window) {
-		_current_window = current;
-		make_current();
-	}
 }
 }
 
 
 bool GLManagerNative_Windows::is_using_vsync(DisplayServer::WindowID p_window_id) const {
 bool GLManagerNative_Windows::is_using_vsync(DisplayServer::WindowID p_window_id) const {

+ 0 - 4
platform/windows/gl_manager_windows_native.h

@@ -68,9 +68,6 @@ private:
 
 
 	PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = nullptr;
 	PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = nullptr;
 
 
-	// funcs
-	void _internal_set_current_window(GLWindow *p_win);
-
 	GLWindow &get_window(unsigned int id) { return _windows[id]; }
 	GLWindow &get_window(unsigned int id) { return _windows[id]; }
 	const GLWindow &get_window(unsigned int id) const { return _windows[id]; }
 	const GLWindow &get_window(unsigned int id) const { return _windows[id]; }
 
 
@@ -91,7 +88,6 @@ 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) {}
 
 
 	void release_current();
 	void release_current();
-	void make_current();
 	void swap_buffers();
 	void swap_buffers();
 
 
 	void window_make_current(DisplayServer::WindowID p_window_id);
 	void window_make_current(DisplayServer::WindowID p_window_id);

+ 1 - 0
scene/main/window.cpp

@@ -1579,6 +1579,7 @@ bool Window::_can_consume_input_events() const {
 }
 }
 
 
 void Window::_window_input(const Ref<InputEvent> &p_ev) {
 void Window::_window_input(const Ref<InputEvent> &p_ev) {
+	ERR_MAIN_THREAD_GUARD;
 	if (EngineDebugger::is_active()) {
 	if (EngineDebugger::is_active()) {
 		// Quit from game window using the stop shortcut (F8 by default).
 		// Quit from game window using the stop shortcut (F8 by default).
 		// The custom shortcut is provided via environment variable when running from the editor.
 		// The custom shortcut is provided via environment variable when running from the editor.

+ 0 - 4
servers/display_server.cpp

@@ -697,10 +697,6 @@ void DisplayServer::release_rendering_thread() {
 	WARN_PRINT("Rendering thread not supported by this display server.");
 	WARN_PRINT("Rendering thread not supported by this display server.");
 }
 }
 
 
-void DisplayServer::make_rendering_thread() {
-	WARN_PRINT("Rendering thread not supported by this display server.");
-}
-
 void DisplayServer::swap_buffers() {
 void DisplayServer::swap_buffers() {
 	WARN_PRINT("Swap buffers not supported by this display server.");
 	WARN_PRINT("Swap buffers not supported by this display server.");
 }
 }

+ 0 - 1
servers/display_server.h

@@ -559,7 +559,6 @@ public:
 	virtual void force_process_and_drop_events();
 	virtual void force_process_and_drop_events();
 
 
 	virtual void release_rendering_thread();
 	virtual void release_rendering_thread();
-	virtual void make_rendering_thread();
 	virtual void swap_buffers();
 	virtual void swap_buffers();
 
 
 	virtual void set_native_icon(const String &p_filename);
 	virtual void set_native_icon(const String &p_filename);

+ 0 - 1
servers/physics_server_2d_wrap_mt.cpp

@@ -96,7 +96,6 @@ void PhysicsServer2DWrapMT::end_sync() {
 
 
 void PhysicsServer2DWrapMT::init() {
 void PhysicsServer2DWrapMT::init() {
 	if (create_thread) {
 	if (create_thread) {
-		//OS::get_singleton()->release_rendering_thread();
 		thread.start(_thread_callback, this);
 		thread.start(_thread_callback, this);
 		while (!step_thread_up.is_set()) {
 		while (!step_thread_up.is_set()) {
 			OS::get_singleton()->delay_usec(1000);
 			OS::get_singleton()->delay_usec(1000);

+ 0 - 1
servers/physics_server_3d_wrap_mt.cpp

@@ -96,7 +96,6 @@ void PhysicsServer3DWrapMT::end_sync() {
 
 
 void PhysicsServer3DWrapMT::init() {
 void PhysicsServer3DWrapMT::init() {
 	if (create_thread) {
 	if (create_thread) {
-		//OS::get_singleton()->release_rendering_thread();
 		thread.start(_thread_callback, this);
 		thread.start(_thread_callback, this);
 		while (!step_thread_up) {
 		while (!step_thread_up) {
 			OS::get_singleton()->delay_usec(1000);
 			OS::get_singleton()->delay_usec(1000);

+ 1 - 2
servers/rendering/rendering_server_default.cpp

@@ -356,8 +356,7 @@ void RenderingServerDefault::_thread_callback(void *_instance) {
 void RenderingServerDefault::_thread_loop() {
 void RenderingServerDefault::_thread_loop() {
 	server_thread = Thread::get_caller_id();
 	server_thread = Thread::get_caller_id();
 
 
-	DisplayServer::get_singleton()->make_rendering_thread();
-
+	DisplayServer::get_singleton()->gl_window_make_current(DisplayServer::MAIN_WINDOW_ID); // Move GL to this thread.
 	_init();
 	_init();
 
 
 	draw_thread_up.set();
 	draw_thread_up.set();