diff --git a/src/backends/native/meta-kms-impl-simple.c b/src/backends/native/meta-kms-impl-simple.c index c4dd31d38..fc8d2929e 100644 --- a/src/backends/native/meta-kms-impl-simple.c +++ b/src/backends/native/meta-kms-impl-simple.c @@ -324,6 +324,13 @@ retry_page_flip_data_free (RetryPageFlipData *retry_page_flip_data) g_free (retry_page_flip_data); } +static CachedModeSet * +get_cached_mode_set (MetaKmsImplSimple *impl_simple, + MetaKmsCrtc *crtc) +{ + return g_hash_table_lookup (impl_simple->cached_mode_sets, crtc); +} + static float get_cached_crtc_refresh_rate (MetaKmsImplSimple *impl_simple, MetaKmsCrtc *crtc) @@ -645,14 +652,30 @@ process_page_flip (MetaKmsImpl *impl, if (ret == -EBUSY) { - float refresh_rate; + CachedModeSet *cached_mode_set; - refresh_rate = get_cached_crtc_refresh_rate (impl_simple, crtc); - schedule_retry_page_flip (impl_simple, - crtc, - plane_assignment->fb_id, - refresh_rate, - page_flip_data); + cached_mode_set = get_cached_mode_set (impl_simple, crtc); + if (cached_mode_set) + { + drmModeModeInfo *drm_mode; + float refresh_rate; + + drm_mode = cached_mode_set->drm_mode; + refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode); + schedule_retry_page_flip (impl_simple, + crtc, + plane_assignment->fb_id, + refresh_rate, + page_flip_data); + } + else + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Page flip of %u failed, and no mode set available", + meta_kms_crtc_get_id (crtc)); + meta_kms_page_flip_data_unref (page_flip_data); + return FALSE; + } } else if (ret == -EINVAL) {