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>
This commit is contained in:
Daniel van Vugt 2024-04-03 16:58:13 +08:00 committed by Marge Bot
parent 82c0f9c57d
commit 22689d722a

View File

@ -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;
}