diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 65c138ce6..024537172 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -2038,13 +2038,29 @@ disarm_all_frame_sources (MetaKmsImplDevice *impl_device) g_hash_table_iter_init (&iter, priv->crtc_frames); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &crtc_frame)) { + MetaKmsUpdate *submitted_update; + crtc_frame->deadline.is_deadline_page_flip = FALSE; crtc_frame->await_flush = FALSE; crtc_frame->pending_page_flip = FALSE; g_clear_pointer (&crtc_frame->pending_update, meta_kms_update_free); disarm_crtc_frame_deadline_timer (crtc_frame); - g_clear_pointer (&crtc_frame->submitted_update.kms_update, meta_kms_update_free); + submitted_update = + g_steal_pointer (&crtc_frame->submitted_update.kms_update); + if (submitted_update) + { + MetaKmsFeedback *feedback = NULL; + GError *error; + + error = g_error_new (META_KMS_ERROR, + META_KMS_ERROR_DISCARDED, + "Timer disarmed"); + feedback = meta_kms_feedback_new_failed (NULL, error); + queue_result_feedback (impl_device, submitted_update, feedback); + meta_kms_feedback_unref (feedback); + g_clear_pointer (&submitted_update, meta_kms_update_free); + } g_clear_pointer (&crtc_frame->submitted_update.source, g_source_destroy); } } diff --git a/src/backends/native/meta-kms.h b/src/backends/native/meta-kms.h index 057c7a234..f5ec4c1c3 100644 --- a/src/backends/native/meta-kms.h +++ b/src/backends/native/meta-kms.h @@ -29,6 +29,7 @@ enum META_KMS_ERROR_DENY_LISTED, META_KMS_ERROR_NOT_SUPPORTED, META_KMS_ERROR_EMPTY_UPDATE, + META_KMS_ERROR_DISCARDED, }; typedef enum _MetaKmsFlags diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 987deea85..021ada367 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -343,7 +343,11 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc, if (error && !g_error_matches (error, G_IO_ERROR, - G_IO_ERROR_PERMISSION_DENIED)) + G_IO_ERROR_PERMISSION_DENIED) && + !g_error_matches (error, + META_KMS_ERROR, + META_KMS_ERROR_DISCARDED)) + g_warning ("Page flip discarded: %s", error->message); frame_info = cogl_onscreen_peek_head_frame_info (onscreen);