summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel van Vugt <daniel.van.vugt@canonical.com>2023-03-24 17:01:10 +0800
committerMarge Bot <marge-bot@gnome.org>2023-03-29 10:43:31 +0000
commit61801a713a29fe160e1c32b8aafe50cc31d128aa (patch)
treee8928cc2968a94ce0e9c23d7fe32537c9a8ff7e6
parentb215a65776418dfb20c1fe10883fdc92548f6ac9 (diff)
downloadmutter-61801a713a29fe160e1c32b8aafe50cc31d128aa.tar.gz
onscreen/native: Avoid freezing the frame clock on failed cursor commits
Since 73fb64cbb6 we have preferred to handle failed updates via callback but the cursor-only update path was forgotten and so wasn't getting frame notifications. And so the frame clock would freeze. Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2691 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2933>
-rw-r--r--src/backends/native/meta-onscreen-native.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index 3fc020024..1ab117eb9 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -1525,6 +1525,29 @@ meta_onscreen_native_prepare_frame (CoglOnscreen *onscreen,
}
}
+static void
+on_finish_frame_update_result (const MetaKmsFeedback *kms_feedback,
+ gpointer user_data)
+{
+ CoglOnscreen *onscreen = COGL_ONSCREEN (user_data);
+ const GError *error;
+ CoglFrameInfo *frame_info;
+
+ error = meta_kms_feedback_get_error (kms_feedback);
+ if (!error)
+ return;
+
+ if (!g_error_matches (error,
+ G_IO_ERROR,
+ G_IO_ERROR_PERMISSION_DENIED))
+ g_warning ("Cursor update failed: %s", error->message);
+
+ frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
+ frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
+
+ meta_onscreen_native_notify_frame_complete (onscreen);
+}
+
void
meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
ClutterFrame *frame)
@@ -1544,6 +1567,10 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
return;
}
+ meta_kms_update_add_result_listener (kms_update,
+ on_finish_frame_update_result,
+ onscreen_native);
+
meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc,
&page_flip_listener_vtable,