macOS: Support vsync when embedding OpenGL processes

Closes #106379
This commit is contained in:
Stuart Carnie
2025-05-20 09:37:35 +10:00
parent be3ecaeb3c
commit aae3370fcd
10 changed files with 216 additions and 63 deletions

View File

@@ -135,6 +135,7 @@ DisplayServerEmbedded::DisplayServerEmbedded(const String &p_rendering_driver, W
if (err != OK) {
ERR_FAIL_MSG("Could not create OpenGL context.");
}
gl_manager->set_vsync_enabled(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
}
#endif
@@ -708,15 +709,44 @@ void DisplayServerEmbedded::window_set_ime_position(const Point2i &p_pos, Window
}
void DisplayServerEmbedded::set_state(const DisplayServerEmbeddedState &p_state) {
if (state == p_state) {
return;
}
uint32_t old_display_id = state.display_id;
state = p_state;
if (state.display_id != old_display_id) {
#if defined(GLES3_ENABLED)
if (gl_manager) {
gl_manager->set_display_id(state.display_id);
}
#endif
}
}
void DisplayServerEmbedded::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) {
// Not supported
#if defined(GLES3_ENABLED)
if (gl_manager) {
gl_manager->set_vsync_enabled(p_vsync_mode != DisplayServer::VSYNC_DISABLED);
}
#endif
#if defined(RD_ENABLED)
if (rendering_context) {
rendering_context->window_set_vsync_mode(p_window, p_vsync_mode);
}
#endif
}
DisplayServer::VSyncMode DisplayServerEmbedded::window_get_vsync_mode(WindowID p_window) const {
_THREAD_SAFE_METHOD_
#if defined(GLES3_ENABLED)
if (gl_manager) {
return (gl_manager->is_vsync_enabled() ? DisplayServer::VSyncMode::VSYNC_ENABLED : DisplayServer::VSyncMode::VSYNC_DISABLED);
}
#endif
#if defined(RD_ENABLED)
if (rendering_context) {
return rendering_context->window_get_vsync_mode(p_window);
@@ -762,14 +792,15 @@ void DisplayServerEmbedded::swap_buffers() {
}
void DisplayServerEmbeddedState::serialize(PackedByteArray &r_data) {
r_data.resize(8);
r_data.resize(12);
uint8_t *data = r_data.ptrw();
data += encode_float(screen_max_scale, data);
data += encode_float(screen_dpi, data);
data += encode_uint32(display_id, data);
// Assert we had enough space.
DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
DEV_ASSERT((data - r_data.ptrw()) >= r_data.size());
}
Error DisplayServerEmbeddedState::deserialize(const PackedByteArray &p_data) {
@@ -778,6 +809,8 @@ Error DisplayServerEmbeddedState::deserialize(const PackedByteArray &p_data) {
screen_max_scale = decode_float(data);
data += sizeof(float);
screen_dpi = decode_float(data);
data += sizeof(float);
display_id = decode_uint32(data);
return OK;
}