diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2019-03-29 20:56:57 +0100 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2019-04-02 13:50:00 +0000 |
commit | b2d0184c6efa164ad5dd7a2ca8b10cf13acf5b4c (patch) | |
tree | 541e59ab775ab0c5f6d0e0d8ef49305968749eac | |
parent | 808a75b231ae68cb746695b4617866a5cd5a8fe3 (diff) | |
download | mutter-b2d0184c6efa164ad5dd7a2ca8b10cf13acf5b4c.tar.gz |
renderer-native: Freeze frames while retrying to page flip
We're currently always waiting for unfinished page flips before flipping
again. This is awkward when we are in an asynchronous retry-page-flip
loop, as we can synchronously wait for any KMS page flip event.
To avoid ending up with such situations, just freeze the frame clock
while we're retrying, then thaw it when we succeded.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/506
-rw-r--r-- | src/backends/native/meta-renderer-native.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 8258da37d..086e8e43c 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1703,6 +1703,9 @@ retry_page_flips (gpointer user_data) } else { + MetaBackend *backend = backend_from_renderer_native (renderer_native); + + meta_backend_thaw_updates (backend); g_clear_pointer (&onscreen_native->retry_page_flips_source, g_source_unref); return G_SOURCE_REMOVE; @@ -1743,6 +1746,8 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native, if (!onscreen_native->retry_page_flips_source) { + MetaBackend *backend = + backend_from_renderer_native (onscreen_native->renderer_native); GSource *source; source = g_source_new (&retry_page_flips_source_funcs, sizeof (GSource)); @@ -1751,6 +1756,7 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native, g_source_attach (source, NULL); onscreen_native->retry_page_flips_source = source; + meta_backend_freeze_updates (backend); } else { @@ -3048,8 +3054,15 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen) g_list_free_full (onscreen_native->pending_page_flip_retries, (GDestroyNotify) retry_page_flip_data_free); - g_clear_pointer (&onscreen_native->retry_page_flips_source, - g_source_destroy); + if (onscreen_native->retry_page_flips_source) + { + MetaBackend *backend = + backend_from_renderer_native (onscreen_native->renderer_native); + + meta_backend_thaw_updates (backend); + g_clear_pointer (&onscreen_native->retry_page_flips_source, + g_source_destroy); + } if (onscreen_egl->egl_surface != EGL_NO_SURFACE) { |