diff options
author | Fredrik Höglund <fredrik@kde.org> | 2007-08-18 19:02:18 +0200 |
---|---|---|
committer | Fredrik Höglund <fredrik@kde.org> | 2007-08-18 19:02:18 +0200 |
commit | 3c448b0eb67337b56641e09a6d168aad6745e3ef (patch) | |
tree | fa50670cf0457321fd0adfaf1fe5622beaf5bfcd | |
parent | 23fbd5292d356067e85e1eec4eb4f743532b0503 (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.
-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) { |