소스 검색

Fixes vsync setting ignored when using a separate thread for rendering

Setting the vsync in the main thread, after the rendering thread starts
and takes the OpenGL context fails, so we need to do that before.
Also, for some reason, the main thread cannot make current the context
anymore.

Fixes #13447
Stefano Bonicatti 7 년 전
부모
커밋
c067cf2c6a
7개의 변경된 파일12개의 추가작업 그리고 4개의 파일을 삭제
  1. 3 1
      core/os/os.h
  2. 1 3
      main/main.cpp
  3. 1 0
      platform/haiku/os_haiku.cpp
  4. 2 0
      platform/osx/os_osx.mm
  5. 1 0
      platform/uwp/os_uwp.cpp
  6. 2 0
      platform/windows/os_windows.cpp
  7. 2 0
      platform/x11/os_x11.cpp

+ 3 - 1
core/os/os.h

@@ -92,14 +92,16 @@ public:
 		bool resizable;
 		bool borderless_window;
 		bool maximized;
+		bool use_vsync;
 		float get_aspect() const { return (float)width / (float)height; }
-		VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false) {
+		VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false, bool p_use_vsync = false) {
 			width = p_width;
 			height = p_height;
 			fullscreen = p_fullscreen;
 			resizable = p_resizable;
 			borderless_window = p_borderless_window;
 			maximized = p_maximized;
+			use_vsync = p_use_vsync;
 		}
 	};
 

+ 1 - 3
main/main.cpp

@@ -819,7 +819,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 		OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false);
 	}
 
-	use_vsync = GLOBAL_DEF("display/window/vsync/use_vsync", true);
+	video_mode.use_vsync = GLOBAL_DEF("display/window/vsync/use_vsync", true);
 
 	GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation", 2);
 	GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_allocation.mobile", 3);
@@ -993,8 +993,6 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 	// also init our arvr_server from here
 	arvr_server = memnew(ARVRServer);
 
-	OS::get_singleton()->set_use_vsync(use_vsync);
-
 	register_core_singletons();
 
 	MAIN_PRINT("Main: Setup Logo");

+ 1 - 0
platform/haiku/os_haiku.cpp

@@ -105,6 +105,7 @@ void OS_Haiku::initialize(const VideoMode &p_desired, int p_video_driver, int p_
 	context_gl = memnew(ContextGL_Haiku(window));
 	context_gl->initialize();
 	context_gl->make_current();
+	context_gl->set_use_vsync(current_video_mode.use_vsync);
 
 	/* Port to GLES 3 rasterizer */
 	//rasterizer = memnew(RasterizerGLES2);

+ 2 - 0
platform/osx/os_osx.mm

@@ -1089,6 +1089,8 @@ void OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_au
 
 	[context makeCurrentContext];
 
+	set_use_vsync(p_desired.use_vsync);
+
 	[NSApp activateIgnoringOtherApps:YES];
 
 	_update_window();

+ 1 - 0
platform/uwp/os_uwp.cpp

@@ -241,6 +241,7 @@ void OSUWP::initialize(const VideoMode &p_desired, int p_video_driver, int p_aud
 
 	RasterizerGLES3::register_config();
 	RasterizerGLES3::make_current();
+	gl_context->set_use_vsync(vm.use_vsync);
 
 	visual_server = memnew(VisualServerRaster);
 	// FIXME: Reimplement threaded rendering? Or remove?

+ 2 - 0
platform/windows/os_windows.cpp

@@ -1074,6 +1074,8 @@ void OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int
 	RasterizerGLES3::register_config();
 
 	RasterizerGLES3::make_current();
+
+	gl_context->set_use_vsync(video_mode.use_vsync);
 #endif
 
 	visual_server = memnew(VisualServerRaster);

+ 2 - 0
platform/x11/os_x11.cpp

@@ -286,6 +286,8 @@ void OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_au
 
 	RasterizerGLES3::make_current();
 
+	context_gl->set_use_vsync(current_videomode.use_vsync);
+
 #endif
 	visual_server = memnew(VisualServerRaster);