File mutter-allow-gpu-fence-to-be-moved.patch of Package mutter.40127
From 22689d722ab4e13ab272c3534f5d18a55c94084f Mon Sep 17 00:00:00 2001
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
Date: Wed, 3 Apr 2024 16:58:13 +0800
Subject: [PATCH] compositor/sync-ring: Allow the gpu_fence to be moved
When the compositor inserts two waits in a frame, such as f606a4424a5afc,
the second insertion shouldn't break the ring's state machine as easily
as it does. We can instead merge the two GL waits into one by simply moving
the GL fence to the latest insertion. Each insertion still does its own X11
sync though.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3384
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3685>
---
src/compositor/meta-sync-ring.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c
index 8f5d1a0465b..1267dd4f2ca 100644
--- a/src/compositor/meta-sync-ring.c
+++ b/src/compositor/meta-sync-ring.c
@@ -544,20 +544,29 @@ gboolean
meta_sync_ring_insert_wait (void)
{
MetaSyncRing *ring = meta_sync_ring_get ();
+ MetaSync *sync;
if (!ring)
return FALSE;
g_return_val_if_fail (ring->xdisplay != NULL, FALSE);
- if (ring->current_sync->state != META_SYNC_STATE_READY)
+ sync = ring->current_sync;
+
+ if (sync->state == META_SYNC_STATE_WAITING)
+ {
+ meta_gl_delete_sync (sync->gpu_fence);
+ sync->gpu_fence = 0;
+ sync->state = META_SYNC_STATE_READY;
+ }
+ else if (sync->state != META_SYNC_STATE_READY)
{
meta_warning ("MetaSyncRing: Sync object is not ready -- were events handled properly?");
if (!meta_sync_ring_reboot (ring->xdisplay))
return FALSE;
}
- meta_sync_insert (ring->current_sync);
+ meta_sync_insert (sync);
return TRUE;
}
--
GitLab