summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉric Piel <E.A.B.Piel@tudelft.nl>2010-06-11 09:16:32 -0700
committerPeter Hutterer <peter.hutterer@who-t.net>2010-06-13 15:14:21 +1000
commite50f84d69811baea04ef559d846e4588c4bc4c8e (patch)
tree09c9458b80a9d456fc77bb459ea4f2eac536d743
parent75c1ba8b4fd0cbf5a6eb41fefc4ec728790589df (diff)
exa: fix ExaCheckCopyNtoN for exa_classic when source = dest
In case you want to copy a region with source = dest, you have the same pixmap as source and dest. At the end of exaPixmapIsOffscreen_classic() the devPrivate.ptr is reset to NULL (look at the sources). Now this is what happens in ExaCheckCopyNtoN: exaPrepareAccess( pDst ); Calls IsOffscreen() sets devPrivate.ptr to NULL sets up devPrivate.ptr to real pointer Everything OK exaPrepareAccess( pSrc ); Calls IsOffscreen() sets devPrivate.ptr to NULL BAILS OUT CAUSE OF NESTED OPERATION SINCE DST EQUALS SRC We end up with devPrivate.ptr as NULL, and that is clearly wrong. In particular this fixes a segfault when using the psb driver (bug 28077) Signed-off-by: Éric Piel <eric.piel@tremplin-utc.net> Reviewed-by: Michel Dänzer <michel@daenzer.net> Signed-off-by: Keith Packard <keithp@keithp.com> (cherry picked from commit 7e8f1001217326cc451974bacf25275420c4bb4e)
-rw-r--r--exa/exa_classic.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/exa/exa_classic.c b/exa/exa_classic.c
index c31e2d4b3..9bc369ec1 100644
--- a/exa/exa_classic.c
+++ b/exa/exa_classic.c
@@ -256,9 +256,10 @@ exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap)
Bool ret;
if (pExaScr->info->PixmapIsOffscreen) {
+ void* old_ptr = pPixmap->devPrivate.ptr;
pPixmap->devPrivate.ptr = ExaGetPixmapAddress(pPixmap);
ret = pExaScr->info->PixmapIsOffscreen(pPixmap);
- pPixmap->devPrivate.ptr = NULL;
+ pPixmap->devPrivate.ptr = old_ptr;
} else
ret = (pExaPixmap->use_gpu_copy && pExaPixmap->fb_ptr);