diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-06-26 18:36:05 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-06-26 18:41:01 +0100 |
commit | 5cd7f5b59857f221bd3aa9965b43b938ff7824ed (patch) | |
tree | 157826bdcee6be5d73f2561cf5d338e7b6931c50 | |
parent | c4f7959266571f14c43c0f0cea69134bb8556875 (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.c | 16 |
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); |