diff -up clutter-1.20.0/clutter/x11/clutter-backend-x11.c.enable-threaded-swap-wait clutter-1.20.0/clutter/x11/clutter-backend-x11.c
--- clutter-1.20.0/clutter/x11/clutter-backend-x11.c.enable-threaded-swap-wait	2016-06-29 15:46:54.250758214 -0400
+++ clutter-1.20.0/clutter/x11/clutter-backend-x11.c	2016-06-29 15:47:58.573790526 -0400
@@ -91,6 +91,7 @@ static const gchar *atom_names[] = {
 
 /* various flags corresponding to pre init setup calls */
 static gboolean _want_reset_on_video_memory_purge = FALSE;
+static gboolean _enable_threaded_swap_wait = FALSE;
 static gboolean _no_xevent_retrieval = FALSE;
 static gboolean clutter_enable_xinput = TRUE;
 static gboolean clutter_enable_argb = FALSE;
@@ -688,6 +689,9 @@ clutter_backend_x11_get_renderer (Clutte
   cogl_xlib_renderer_set_foreign_display (renderer, xdisplay);
   cogl_xlib_renderer_request_reset_on_video_memory_purge (renderer,
                                                           _want_reset_on_video_memory_purge);
+  cogl_xlib_renderer_set_threaded_swap_wait_enabled (renderer,
+						     _enable_threaded_swap_wait);
+ 
   return renderer;
 }
 
@@ -1054,6 +1058,30 @@ clutter_x11_request_reset_on_video_memor
 }
 
 /**
+ * clutter_x11_enable_threaded_swap_wait:
+ *
+ * If the driver doesn't have a better way to wait for frame completion,
+ * and is on a whitelist of drivers where using a separate thread for
+ * frame completion is known to work, do that. XInitThreads() must be
+ * called by the application before any other Xlib calls. See docs for
+ * cogl_xlib_renderer_set_threaded_swap_wait_enabled() for more details.
+ *
+ * This function can only be called before calling clutter_init().
+ */
+void
+clutter_x11_enable_threaded_swap_wait (void)
+{
+  if (_clutter_context_is_initialized ())
+    {
+      g_warning ("%s() can only be used before calling clutter_init()",
+		 G_STRFUNC);
+      return;
+     }
+
+  _enable_threaded_swap_wait = TRUE;
+}
+
+/**
  * clutter_x11_get_default_screen:
  *
  * Gets the number of the default X Screen object.
diff -up clutter-1.20.0/clutter/x11/clutter-x11.h.enable-threaded-swap-wait clutter-1.20.0/clutter/x11/clutter-x11.h
--- clutter-1.20.0/clutter/x11/clutter-x11.h.enable-threaded-swap-wait	2016-06-29 15:46:54.252758246 -0400
+++ clutter-1.20.0/clutter/x11/clutter-x11.h	2016-06-29 15:47:27.193287248 -0400
@@ -173,6 +173,9 @@ guint clutter_x11_event_sequence_get_tou
 CLUTTER_AVAILABLE_IN_ALL
 void clutter_x11_request_reset_on_video_memory_purge (void);
 
+CLUTTER_AVAILABLE_IN_ALL
+void clutter_x11_enable_threaded_swap_wait (void);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_X11_H__ */
