compositor: Sync X drawing only once per frame

We only need to call XSync() once per frame to synchronize X with GL
drawing.

https://bugzilla.gnome.org/show_bug.cgi?id=728464
This commit is contained in:
Rui Matos 2014-05-12 15:11:53 +02:00
parent 3d1d155561
commit 1ed41b7ed3
3 changed files with 31 additions and 20 deletions

View File

@ -32,6 +32,8 @@ struct _MetaCompositor
guint show_redraw : 1;
guint debug : 1;
guint no_mipmaps : 1;
gboolean need_sync_drawing;
};
struct _MetaCompScreen

View File

@ -173,6 +173,8 @@ process_damage (MetaCompositor *compositor,
return;
meta_window_actor_process_damage (window_actor, event);
compositor->need_sync_drawing = TRUE;
}
static void
@ -1484,6 +1486,33 @@ meta_repaint_func (gpointer data)
pre_paint_windows (info);
}
if (compositor->need_sync_drawing)
{
/* We need to make sure that any X drawing that happens before
* the XDamageSubtract() for each MWA above is visible to
* subsequent GL rendering; the only standardized way to do this
* is EXT_x11_sync_object, which isn't yet widely available. For
* now, we count on details of Xorg and the open source drivers,
* and hope for the best otherwise.
*
* Xorg and open source driver specifics:
*
* The X server makes sure to flush drawing to the kernel before
* sending out damage events, but since we use
* DamageReportBoundingBox there may be drawing between the last
* damage event and the XDamageSubtract() that needs to be
* flushed as well.
*
* Xorg always makes sure that drawing is flushed to the kernel
* before writing events or responses to the client, so any
* round trip request at this point is sufficient to flush the
* GLX buffers.
*/
XSync (compositor->display->xdisplay, False);
compositor->need_sync_drawing = FALSE;
}
return TRUE;
}

View File

@ -2376,26 +2376,6 @@ meta_window_actor_handle_updates (MetaWindowActor *self)
XDamageSubtract (xdisplay, priv->damage, None, None);
meta_error_trap_pop (display);
/* We need to make sure that any X drawing that happens before the
* XDamageSubtract() above is visible to subsequent GL rendering;
* the only standardized way to do this is EXT_x11_sync_object,
* which isn't yet widely available. For now, we count on details
* of Xorg and the open source drivers, and hope for the best
* otherwise.
*
* Xorg and open source driver specifics:
*
* The X server makes sure to flush drawing to the kernel before
* sending out damage events, but since we use DamageReportBoundingBox
* there may be drawing between the last damage event and the
* XDamageSubtract() that needs to be flushed as well.
*
* Xorg always makes sure that drawing is flushed to the kernel
* before writing events or responses to the client, so any round trip
* request at this point is sufficient to flush the GLX buffers.
*/
XSync (xdisplay, False);
priv->received_damage = FALSE;
}