diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index c5766016f..a76dbc5c0 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -45,7 +45,6 @@ #include #include "display-private.h" #include "compositor/compositor-private.h" -#include "compositor/meta-sync-ring.h" typedef enum { /* We're a traditional CM running under the host. */ @@ -267,8 +266,6 @@ handle_host_xevent (MetaBackend *backend, MetaCompositor *compositor = display->compositor; if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) bypass_clutter = TRUE; - if (compositor->have_x11_sync_object) - meta_sync_ring_handle_event (event); } } diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 12822798f..615ebd871 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -529,8 +529,7 @@ meta_compositor_manage (MetaCompositor *compositor) */ XMapWindow (xdisplay, compositor->output); - compositor->have_x11_sync_object = - meta_sync_ring_init (meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend))); + compositor->have_x11_sync_object = meta_sync_ring_init (xdisplay); } redirect_windows (display->screen); @@ -732,6 +731,9 @@ meta_compositor_process_event (MetaCompositor *compositor, process_damage (compositor, (XDamageNotifyEvent *) event, window); } + if (compositor->have_x11_sync_object) + meta_sync_ring_handle_event (event); + /* Clutter needs to know about MapNotify events otherwise it will think the stage is invisible */ if (!meta_is_wayland_compositor () && event->type == MapNotify) diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c index 217ebe569..336ccd45f 100644 --- a/src/compositor/meta-sync-ring.c +++ b/src/compositor/meta-sync-ring.c @@ -322,7 +322,7 @@ meta_sync_new (Display *xdisplay) self->xdisplay = xdisplay; self->xfence = XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE); - self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); + self->gl_x11_sync = 0; self->gpu_fence = 0; self->xcounter = XSyncCreateCounter (xdisplay, SYNC_VALUE_ZERO); @@ -347,6 +347,13 @@ meta_sync_new (Display *xdisplay) return self; } +static void +meta_sync_import (MetaSync *self) +{ + g_return_if_fail (self->gl_x11_sync == 0); + self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); +} + static Bool alarm_event_predicate (Display *dpy, XEvent *event, @@ -437,6 +444,12 @@ meta_sync_ring_init (Display *xdisplay) ring->syncs_array[i] = sync; g_hash_table_replace (ring->alarm_to_sync, (gpointer) sync->xalarm, sync); } + /* Since the connection we create the X fences on isn't the same as + * the one used for the GLX context, we need to XSync() here to + * ensure glImportSync() succeeds. */ + XSync (xdisplay, False); + for (i = 0; i < NUM_SYNCS; ++i) + meta_sync_import (ring->syncs_array[i]); ring->current_sync_idx = 0; ring->current_sync = ring->syncs_array[0];