diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-06 01:38:42 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-06 01:40:12 +0000 |
commit | 75f61678249018c84872c61b4609ba9d3d0d73dc (patch) | |
tree | 9fe1291f637d426c63135d2d0f3716bcdba79dd0 | |
parent | 86cc2cd3343c16b12e35e2048c113481f49196cf (diff) |
sna: Only need to remove the pixmap from the dirty CPU list when clearing damage
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 598e0ce8..afae205f 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -232,6 +232,7 @@ done: static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) { assert(priv->stride); + assert(priv->cpu_damage == NULL); if (priv->cpu_bo) { DBG(("%s: discarding CPU buffer, handle=%d, size=%d\n", @@ -245,7 +246,6 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) free(priv->ptr); priv->pixmap->devPrivate.ptr = priv->ptr = NULL; - list_del(&priv->list); priv->mapped = 0; } @@ -748,7 +748,6 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags) sna_damage_all(&priv->gpu_damage, pixmap->drawable.width, pixmap->drawable.height); - sna_damage_destroy(&priv->cpu_damage); if (priv->cpu_bo) sna_pixmap_free_cpu(sna, priv); @@ -1227,11 +1226,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box) sna_damage_subtract(&priv->cpu_damage, &r); RegionUninit(&i); + + if (priv->cpu_damage == NULL) + list_del(&priv->list); } done: - if (priv->cpu_damage == NULL) - list_del(&priv->list); if (!priv->pinned) list_move(&priv->inactive, &sna->active_pixmaps); return true; @@ -1594,6 +1594,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags) __sna_damage_destroy(priv->cpu_damage); priv->cpu_damage = NULL; + list_del(&priv->list); done: sna_damage_reduce_all(&priv->gpu_damage, @@ -1603,7 +1604,6 @@ done: pixmap->devPrivate.ptr = NULL; priv->mapped = 0; } - list_del(&priv->list); if (!priv->pinned) list_move(&priv->inactive, &sna->active_pixmaps); return priv; @@ -1958,7 +1958,8 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region, if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE)) return false; - } + } else + sna_damage_destroy(&priv->cpu_damage); sna_pixmap_free_cpu(sna, priv); } @@ -9326,6 +9327,7 @@ sna_accel_flush_callback(CallbackListPtr *list, struct sna_pixmap *priv = list_first_entry(&sna->dirty_pixmaps, struct sna_pixmap, list); + assert(priv->cpu_damage != NULL); sna_pixmap_move_to_gpu(priv->pixmap, MOVE_READ); } |