summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFredrik Höglund <fredrik@kde.org>2007-08-18 19:02:18 +0200
committerEric Anholt <eric@anholt.net>2007-08-23 12:21:24 -0700
commitdd33e936b39d1c5229353d3f25c47e3b87de8498 (patch)
treed09632c6eb990a8ddaeb2a73c2e6037f92929e76
parentec126e29e4a270577bba6337ed6f4ec8dbce46f9 (diff)
EXA: Fix a couple of logic errors in exaGetPixmapFirstPixel.
The fb pointer would be left uninitialized when exaPixmapIsOffscreen returned false. When it returned true and the pixmap was damaged, fb would be initialized from the pixmap's devPrivate.ptr before the exaDoMigration and exaPrepareAccess calls, at which point devPrivate.ptr would still be pointing at offscreen memory. (cherry picked from commit 3c448b0eb67337b56641e09a6d168aad6745e3ef)
-rw-r--r--exa/exa_unaccel.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
index b67ea6389..a94648b47 100644
--- a/exa/exa_unaccel.c
+++ b/exa/exa_unaccel.c
@@ -382,19 +382,19 @@ exaGetPixmapFirstPixel (PixmapPtr pPixmap)
ExaMigrationRec pixmaps[1];
ExaPixmapPriv (pPixmap);
+ fb = pExaPixmap->sys_ptr;
+
/* Try to avoid framebuffer readbacks */
- if (exaPixmapIsOffscreen(pPixmap)) {
- if (!miPointInRegion(DamageRegion(pExaPixmap->pDamage), 0, 0, &box)) {
- fb = pExaPixmap->sys_ptr;
- } else {
- need_finish = TRUE;
- fb = pPixmap->devPrivate.ptr;
- pixmaps[0].as_dst = FALSE;
- pixmaps[0].as_src = TRUE;
- pixmaps[0].pPix = pPixmap;
- exaDoMigration (pixmaps, 1, FALSE);
- exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
- }
+ if (exaPixmapIsOffscreen(pPixmap) &&
+ miPointInRegion(DamageRegion(pExaPixmap->pDamage), 0, 0, &box))
+ {
+ need_finish = TRUE;
+ pixmaps[0].as_dst = FALSE;
+ pixmaps[0].as_src = TRUE;
+ pixmaps[0].pPix = pPixmap;
+ exaDoMigration (pixmaps, 1, FALSE);
+ exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
+ fb = pPixmap->devPrivate.ptr;
}
switch (pPixmap->drawable.bitsPerPixel) {