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.
This commit is contained in:
Fredrik Höglund 2007-08-18 19:02:18 +02:00
parent 23fbd5292d
commit 3c448b0eb6

View File

@ -382,19 +382,19 @@ exaGetPixmapFirstPixel (PixmapPtr pPixmap)
ExaMigrationRec pixmaps[1]; ExaMigrationRec pixmaps[1];
ExaPixmapPriv (pPixmap); ExaPixmapPriv (pPixmap);
/* Try to avoid framebuffer readbacks */
if (exaPixmapIsOffscreen(pPixmap)) {
if (!miPointInRegion(DamageRegion(pExaPixmap->pDamage), 0, 0, &box)) {
fb = pExaPixmap->sys_ptr; fb = pExaPixmap->sys_ptr;
} else {
/* Try to avoid framebuffer readbacks */
if (exaPixmapIsOffscreen(pPixmap) &&
miPointInRegion(DamageRegion(pExaPixmap->pDamage), 0, 0, &box))
{
need_finish = TRUE; need_finish = TRUE;
fb = pPixmap->devPrivate.ptr;
pixmaps[0].as_dst = FALSE; pixmaps[0].as_dst = FALSE;
pixmaps[0].as_src = TRUE; pixmaps[0].as_src = TRUE;
pixmaps[0].pPix = pPixmap; pixmaps[0].pPix = pPixmap;
exaDoMigration (pixmaps, 1, FALSE); exaDoMigration (pixmaps, 1, FALSE);
exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC); exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
} fb = pPixmap->devPrivate.ptr;
} }
switch (pPixmap->drawable.bitsPerPixel) { switch (pPixmap->drawable.bitsPerPixel) {