From 29d035279b2fe98d5ba9cf01125faea34d36fb76 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 4 May 2012 09:11:31 +0100 Subject: [PATCH] sna/dri: pageflip unref debugging Signed-off-by: Chris Wilson --- src/sna/sna.h | 3 ++- src/sna/sna_dri.c | 29 +++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/sna/sna.h b/src/sna/sna.h index 956a0383..5272a083 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -130,6 +130,8 @@ struct sna_pixmap { uint32_t stride; uint32_t clear_color; + uint32_t flush; + #define SOURCE_BIAS 4 uint16_t source_count; uint8_t pinned :1; @@ -138,7 +140,6 @@ struct sna_pixmap { uint8_t undamaged :1; uint8_t create :3; uint8_t header :1; - uint8_t flush :1; }; struct sna_glyph { diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c index 1ad2ff16..d5eefcbd 100644 --- a/src/sna/sna_dri.c +++ b/src/sna/sna_dri.c @@ -163,7 +163,7 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna, if (priv == NULL) return NULL; - if (priv->flush) + if (priv->flush++) return priv->gpu_bo; tiling = color_tiling(sna, &pixmap->drawable); @@ -181,7 +181,6 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna, /* Don't allow this named buffer to be replaced */ priv->pinned = 1; - priv->flush = true; return priv->gpu_bo; } @@ -317,17 +316,21 @@ static void _sna_dri_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer) if (buffer == NULL) return; + DBG(("%s: %p [handle=%d] -- refcnt=%d, pixmap=%d\n", + __FUNCTION__, buffer, private->bo->handle, private->refcnt, + private->pixmap ? private->pixmap->drawable.serialNumber : 0)); + if (--private->refcnt == 0) { if (private->pixmap) { ScreenPtr screen = private->pixmap->drawable.pScreen; struct sna_pixmap *priv = sna_pixmap(private->pixmap); /* Undo the DRI markings on this pixmap */ - assert(priv->flush); - list_del(&priv->list); - sna_accel_watch_flush(sna, -1); - priv->pinned = private->pixmap == sna->front; - priv->flush = false; + if (priv->flush && --priv->flush == 0) { + list_del(&priv->list); + sna_accel_watch_flush(sna, -1); + priv->pinned = private->pixmap == sna->front; + } screen->DestroyPixmap(private->pixmap); } @@ -1238,6 +1241,8 @@ static void sna_dri_flip_event(struct sna *sna, flip->next_front.name = flip->front->name; flip->off_delay = 5; } else if (--flip->off_delay) { + DBG(("%s: queuing no-flip [delay=%d]\n", + __FUNCTION__, flip->off_delay)); /* Just queue a no-op flip to trigger another event */ flip->count = sna_page_flip(sna, get_private(flip->front)->bo, @@ -1765,6 +1770,13 @@ blit: goto blit; } + DBG(("%s: referencing (%p:%d, %p:%d)\n", + __FUNCTION__, + front, get_private(front)->refcnt, + back, get_private(back)->refcnt)); + sna_dri_reference_buffer(front); + sna_dri_reference_buffer(back); + if (!sna_dri_page_flip(sna, info)) { sna_dri_frame_event_info_free(info); goto blit; @@ -1773,9 +1785,6 @@ blit: info->next_front.name = info->front->name; info->next_front.bo = get_private(info->front)->bo; info->off_delay = 5; - - sna_dri_reference_buffer(front); - sna_dri_reference_buffer(back); } else if (info->type != DRI2_ASYNC_FLIP) { /* A normal vsync'ed client is finishing, wait for it * to unpin the old framebuffer before taking over.