From eb10ade0fc8e21cd01c0d8acba7891fd7f2aa222 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 5 Mar 2012 22:55:57 +0000 Subject: [PATCH] sna: Defer the FlushCallback removal until after the next flush Try to reduce the amount of Add/Delete ping-pong, in particular around the recreation of the DRI2 attachment to the scanout after pageflipping. Signed-off-by: Chris Wilson --- src/sna/sna_accel.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 1dc0b994..a8737b5f 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -11482,7 +11482,6 @@ sna_accel_flush_callback(CallbackListPtr *list, struct sna *sna = user_data; struct list preserve; - assert(sna->watch_flush); if (!sna->flush) return; @@ -11929,22 +11928,21 @@ Bool sna_accel_create(struct sna *sna) void sna_accel_watch_flush(struct sna *sna, int enable) { + DBG(("%s: enable=%d\n", __FUNCTION__, enable)); + assert(enable); + if (sna->watch_flush == 0) { + DBG(("%s: installing watchers\n", __FUNCTION__)); assert(enable > 0); if (!AddCallback(&ReplyCallback, sna_accel_reply_callback, sna) || - AddCallback(&FlushCallback, sna_accel_flush_callback, sna)) { + !AddCallback(&FlushCallback, sna_accel_flush_callback, sna)) { xf86DrvMsg(sna->scrn->scrnIndex, X_Error, "Failed to attach ourselves to the flush callbacks, expect missing synchronisation with DRI clients (e.g a compositor)\n"); } + sna->watch_flush++; } sna->watch_flush += enable; - - if (sna->watch_flush == 0) { - assert(enable < 0); - DeleteCallback(&ReplyCallback, sna_accel_reply_callback, sna); - DeleteCallback(&FlushCallback, sna_accel_flush_callback, sna); - } } void sna_accel_close(struct sna *sna) @@ -11989,6 +11987,13 @@ void sna_accel_block_handler(struct sna *sna) if (sna_accel_do_inactive(sna)) sna_accel_inactive(sna); + if (sna->flush == 0 && sna->watch_flush == 1) { + DBG(("%s: removing watchers\n", __FUNCTION__)); + DeleteCallback(&ReplyCallback, sna_accel_reply_callback, sna); + DeleteCallback(&FlushCallback, sna_accel_flush_callback, sna); + sna->watch_flush = 0; + } + sna->timer_ready = 0; }