summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-06-26 18:36:05 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-06-26 18:41:01 +0100
commit5cd7f5b59857f221bd3aa9965b43b938ff7824ed (patch)
tree157826bdcee6be5d73f2561cf5d338e7b6931c50
parentc4f7959266571f14c43c0f0cea69134bb8556875 (diff)
sna/dri: Mark the GPU bo as damaged upon a page-flip
...so that CPU pixmap is correctly invalidated for the next readback. For instance, if you were to take a screenshot on a composited destkop. Reported-by: Sitosfe Wheeler <sitsofe@yahoo.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_dri.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index de5312b9..a5535496 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -346,6 +346,20 @@ static void damage(DrawablePtr drawable, PixmapPtr pixmap, RegionPtr region)
}
}
+static void damage_all(PixmapPtr pixmap)
+{
+ struct sna_pixmap *priv;
+
+ priv = sna_pixmap(pixmap);
+ if (priv->gpu_only)
+ return;
+
+ sna_damage_all(&priv->gpu_damage,
+ pixmap->drawable.width,
+ pixmap->drawable.height);
+ sna_damage_destroy(&priv->cpu_damage);
+}
+
static void
sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region,
DRI2BufferPtr dst_buffer, DRI2BufferPtr src_buffer,
@@ -628,6 +642,7 @@ sna_dri_schedule_flip(struct sna *sna,
/* Page flip the full screen buffer */
back_priv = info->back->driverPrivate;
+ damage_all(back_priv->pixmap);
info->count = sna_do_pageflip(sna,
back_priv->pixmap,
info, info->pipe,
@@ -1264,6 +1279,7 @@ sna_dri_async_swap(ClientPtr client, DrawablePtr draw,
}
exchange:
+ damage_all(back_priv->pixmap);
pixmap = sna_set_screen_pixmap(sna, back_priv->pixmap);
screen->DestroyPixmap(pixmap);