EGLManager: Track per-window v-sync state
This commit is contained in:
parent
91eb688e17
commit
e6f0c23d25
|
@ -318,13 +318,20 @@ void EGLManager::window_make_current(DisplayServer::WindowID p_window_id) {
|
||||||
eglMakeCurrent(current_display.egl_display, current_window->egl_surface, current_window->egl_surface, current_display.egl_context);
|
eglMakeCurrent(current_display.egl_display, current_window->egl_surface, current_window->egl_surface, current_display.egl_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EGLManager::set_use_vsync(bool p_use) {
|
void EGLManager::set_use_vsync(DisplayServer::WindowID p_window_id, bool p_use) {
|
||||||
// We need an active window to get a display to set the vsync.
|
ERR_FAIL_INDEX(p_window_id, (int)windows.size());
|
||||||
if (!current_window) {
|
|
||||||
|
GLWindow &glwindow = windows[p_window_id];
|
||||||
|
|
||||||
|
if (!glwindow.initialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLDisplay &disp = displays[current_window->gldisplay_id];
|
if (&glwindow != current_window) {
|
||||||
|
window_make_current(p_window_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLDisplay &disp = displays[glwindow.gldisplay_id];
|
||||||
|
|
||||||
int swap_interval = p_use ? 1 : 0;
|
int swap_interval = p_use ? 1 : 0;
|
||||||
|
|
||||||
|
@ -332,11 +339,13 @@ void EGLManager::set_use_vsync(bool p_use) {
|
||||||
WARN_PRINT("Could not set V-Sync mode.");
|
WARN_PRINT("Could not set V-Sync mode.");
|
||||||
}
|
}
|
||||||
|
|
||||||
use_vsync = p_use;
|
glwindow.use_vsync = p_use;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EGLManager::is_using_vsync() const {
|
bool EGLManager::is_using_vsync(DisplayServer::WindowID p_window_id) const {
|
||||||
return use_vsync;
|
ERR_FAIL_INDEX_V(p_window_id, (int)windows.size(), false);
|
||||||
|
|
||||||
|
return windows[p_window_id].use_vsync;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLContext EGLManager::get_context(DisplayServer::WindowID p_window_id) {
|
EGLContext EGLManager::get_context(DisplayServer::WindowID p_window_id) {
|
||||||
|
|
|
@ -58,6 +58,8 @@ private:
|
||||||
// EGL specific window data.
|
// EGL specific window data.
|
||||||
struct GLWindow {
|
struct GLWindow {
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
|
// On EGL the default swap interval is 1 and thus vsync is on by default.
|
||||||
|
bool use_vsync = true;
|
||||||
|
|
||||||
// An handle to the GLDisplay associated with this window.
|
// An handle to the GLDisplay associated with this window.
|
||||||
int gldisplay_id = -1;
|
int gldisplay_id = -1;
|
||||||
|
@ -70,9 +72,6 @@ private:
|
||||||
|
|
||||||
GLWindow *current_window = nullptr;
|
GLWindow *current_window = nullptr;
|
||||||
|
|
||||||
// On EGL the default swap interval is 1 and thus vsync is on by default.
|
|
||||||
bool use_vsync = true;
|
|
||||||
|
|
||||||
virtual const char *_get_platform_extension_name() const = 0;
|
virtual const char *_get_platform_extension_name() const = 0;
|
||||||
virtual EGLenum _get_platform_extension_enum() const = 0;
|
virtual EGLenum _get_platform_extension_enum() const = 0;
|
||||||
virtual EGLenum _get_platform_api_enum() const = 0;
|
virtual EGLenum _get_platform_api_enum() const = 0;
|
||||||
|
@ -102,8 +101,8 @@ public:
|
||||||
|
|
||||||
void window_make_current(DisplayServer::WindowID p_window_id);
|
void window_make_current(DisplayServer::WindowID p_window_id);
|
||||||
|
|
||||||
void set_use_vsync(bool p_use);
|
void set_use_vsync(DisplayServer::WindowID p_window_id, bool p_use);
|
||||||
bool is_using_vsync() const;
|
bool is_using_vsync(DisplayServer::WindowID p_window_id) const;
|
||||||
|
|
||||||
EGLContext get_context(DisplayServer::WindowID p_window_id);
|
EGLContext get_context(DisplayServer::WindowID p_window_id);
|
||||||
|
|
||||||
|
|
|
@ -945,13 +945,13 @@ void DisplayServerWayland::window_set_vsync_mode(DisplayServer::VSyncMode p_vsyn
|
||||||
|
|
||||||
#ifdef GLES3_ENABLED
|
#ifdef GLES3_ENABLED
|
||||||
if (egl_manager) {
|
if (egl_manager) {
|
||||||
egl_manager->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
egl_manager->set_use_vsync(p_window_id, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
|
|
||||||
emulate_vsync = egl_manager->is_using_vsync();
|
emulate_vsync = egl_manager->is_using_vsync(p_window_id);
|
||||||
|
|
||||||
if (emulate_vsync) {
|
if (emulate_vsync) {
|
||||||
print_verbose("VSYNC: manually throttling frames with swap delay 0.");
|
print_verbose("VSYNC: manually throttling frames with swap delay 0.");
|
||||||
egl_manager->set_use_vsync(false);
|
egl_manager->set_use_vsync(p_window_id, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // GLES3_ENABLED
|
#endif // GLES3_ENABLED
|
||||||
|
@ -970,7 +970,7 @@ DisplayServer::VSyncMode DisplayServerWayland::window_get_vsync_mode(DisplayServ
|
||||||
|
|
||||||
#ifdef GLES3_ENABLED
|
#ifdef GLES3_ENABLED
|
||||||
if (egl_manager) {
|
if (egl_manager) {
|
||||||
return egl_manager->is_using_vsync() ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
return egl_manager->is_using_vsync(p_window_id) ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
||||||
}
|
}
|
||||||
#endif // GLES3_ENABLED
|
#endif // GLES3_ENABLED
|
||||||
|
|
||||||
|
|
|
@ -5367,7 +5367,7 @@ void DisplayServerX11::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mo
|
||||||
gl_manager->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
if (gl_manager_egl) {
|
if (gl_manager_egl) {
|
||||||
gl_manager_egl->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager_egl->set_use_vsync(p_window, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -5384,7 +5384,7 @@ DisplayServer::VSyncMode DisplayServerX11::window_get_vsync_mode(WindowID p_wind
|
||||||
return gl_manager->is_using_vsync() ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
return gl_manager->is_using_vsync() ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
||||||
}
|
}
|
||||||
if (gl_manager_egl) {
|
if (gl_manager_egl) {
|
||||||
return gl_manager_egl->is_using_vsync() ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
return gl_manager_egl->is_using_vsync(p_window) ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return DisplayServer::VSYNC_ENABLED;
|
return DisplayServer::VSYNC_ENABLED;
|
||||||
|
|
|
@ -2688,7 +2688,7 @@ void DisplayServerMacOS::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
#if defined(GLES3_ENABLED)
|
#if defined(GLES3_ENABLED)
|
||||||
if (gl_manager_angle) {
|
if (gl_manager_angle) {
|
||||||
gl_manager_angle->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager_angle->set_use_vsync(p_window, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
if (gl_manager_legacy) {
|
if (gl_manager_legacy) {
|
||||||
gl_manager_legacy->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager_legacy->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
|
@ -2705,7 +2705,7 @@ DisplayServer::VSyncMode DisplayServerMacOS::window_get_vsync_mode(WindowID p_wi
|
||||||
_THREAD_SAFE_METHOD_
|
_THREAD_SAFE_METHOD_
|
||||||
#if defined(GLES3_ENABLED)
|
#if defined(GLES3_ENABLED)
|
||||||
if (gl_manager_angle) {
|
if (gl_manager_angle) {
|
||||||
return (gl_manager_angle->is_using_vsync() ? DisplayServer::VSyncMode::VSYNC_ENABLED : DisplayServer::VSyncMode::VSYNC_DISABLED);
|
return (gl_manager_angle->is_using_vsync(p_window) ? DisplayServer::VSyncMode::VSYNC_ENABLED : DisplayServer::VSyncMode::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
if (gl_manager_legacy) {
|
if (gl_manager_legacy) {
|
||||||
return (gl_manager_legacy->is_using_vsync() ? DisplayServer::VSyncMode::VSYNC_ENABLED : DisplayServer::VSyncMode::VSYNC_DISABLED);
|
return (gl_manager_legacy->is_using_vsync() ? DisplayServer::VSyncMode::VSYNC_ENABLED : DisplayServer::VSyncMode::VSYNC_DISABLED);
|
||||||
|
|
|
@ -3419,7 +3419,7 @@ void DisplayServerWindows::window_set_vsync_mode(DisplayServer::VSyncMode p_vsyn
|
||||||
gl_manager_native->set_use_vsync(p_window, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager_native->set_use_vsync(p_window, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
if (gl_manager_angle) {
|
if (gl_manager_angle) {
|
||||||
gl_manager_angle->set_use_vsync(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
gl_manager_angle->set_use_vsync(p_window, p_vsync_mode != DisplayServer::VSYNC_DISABLED);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -3437,7 +3437,7 @@ DisplayServer::VSyncMode DisplayServerWindows::window_get_vsync_mode(WindowID p_
|
||||||
return gl_manager_native->is_using_vsync(p_window) ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
return gl_manager_native->is_using_vsync(p_window) ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
||||||
}
|
}
|
||||||
if (gl_manager_angle) {
|
if (gl_manager_angle) {
|
||||||
return gl_manager_angle->is_using_vsync() ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
return gl_manager_angle->is_using_vsync(p_window) ? DisplayServer::VSYNC_ENABLED : DisplayServer::VSYNC_DISABLED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return DisplayServer::VSYNC_ENABLED;
|
return DisplayServer::VSYNC_ENABLED;
|
||||||
|
|
Loading…
Reference in New Issue