diff options
author | Fredrik Höglund <fredrik@kde.org> | 2007-08-18 19:02:18 +0200 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2007-08-23 12:21:24 -0700 |
commit | dd33e936b39d1c5229353d3f25c47e3b87de8498 (patch) | |
tree | d09632c6eb990a8ddaeb2a73c2e6037f92929e76 | |
parent | ec126e29e4a270577bba6337ed6f4ec8dbce46f9 (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.c | 24 |
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) { |