From 5003a0549111eff2ecdd9ac23f46f675183b7fd1 Mon Sep 17 00:00:00 2001 From: gongqi <550230171hxy@gmail.com> Date: Mon, 18 May 2026 20:18:28 +0800 Subject: [PATCH] wayland: optimize frame scheduling for 120Hz+ displays - Use 0ms sync delay on Wayland (KMS page-flip already syncs) - Halve page-flip retry interval on EBUSY for faster recovery Fixes flickering on high-refresh-rate panels under Cinnamon Wayland. Tested on AMD Radeon 880M @ 2560x1600@120Hz. --- src/backends/native/meta-kms-impl-simple.c | 7 +++++-- src/compositor/compositor-private.h | 4 ++++ src/compositor/compositor.c | 5 ++++- 3 files changed, 13 insertions(+), 3 deletions(-) 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);