diff --git a/src/backends/native/meta-kms-impl-simple.c b/src/backends/native/meta-kms-impl-simple.c index a687d78c6..da7fdbd1d 100644 --- a/src/backends/native/meta-kms-impl-simple.c +++ b/src/backends/native/meta-kms-impl-simple.c @@ -400,10 +400,13 @@ retry_page_flips (gpointer user_data) if (ret == -EBUSY) { float refresh_rate; + gint64 retry_interval; refresh_rate = get_cached_crtc_refresh_rate (impl_simple, crtc); - retry_page_flip_data->retry_time_us += - (uint64_t) (G_USEC_PER_SEC / refresh_rate); + /* On high-refresh displays, retry sooner than a full cycle + * to recover faster from transient EBUSY. */ + retry_interval = (gint64) (G_USEC_PER_SEC / refresh_rate) / 2; + retry_page_flip_data->retry_time_us += MAX (retry_interval, 500); l = l_next; continue; } diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index 42ca3f4a9..434100fb1 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -14,6 +14,10 @@ /* Wait 2ms after vblank before starting to draw next frame */ #define META_SYNC_DELAY 2 +/* On Wayland the KMS page-flip event already synchronizes rendering; + * a fixed delay consumes too much budget on 120 Hz+. */ +#define META_SYNC_DELAY_WAYLAND 0 + typedef struct _MetaLaters MetaLaters; struct _MetaCompositorClass diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 52479b0b4..31850a6b3 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -726,7 +726,10 @@ meta_compositor_do_manage (MetaCompositor *compositor, g_signal_connect_after (priv->stage, "after-paint", G_CALLBACK (after_stage_paint), compositor); - clutter_stage_set_sync_delay (CLUTTER_STAGE (priv->stage), META_SYNC_DELAY); + if (meta_is_wayland_compositor ()) + clutter_stage_set_sync_delay (CLUTTER_STAGE (priv->stage), META_SYNC_DELAY_WAYLAND); + else + clutter_stage_set_sync_delay (CLUTTER_STAGE (priv->stage), META_SYNC_DELAY); priv->window_group = meta_window_group_new (display); priv->top_window_group = meta_window_group_new (display);