EXA: Fix mixed pixmaps crash with missing / failing UploadToScreen hook.
For the recent mixed pixmaps changes, I failed to realize (or hit in my testing) a problem which can occur if the driver doesn't provide an UploadToScreen hook or provides one which can fail: There can be a crash in exaMemcpyBox() because exaCopyDirtyToFb() passes pExaPixmap->fb_ptr to exaCopyDirty(), but that's normally NULL with driver allocated pixmaps. The solution is to make exaCopyDirty*() no longer rely on pExaPixmap->fb_ptr but use pPixmap->devPrivate.ptr after PrepareAccess instead. Fixes http://bugs.freedesktop.org/show_bug.cgi?id=24167 .
This commit is contained in:
parent
c9ec2bab2f
commit
73ae547d5e
|
@ -104,9 +104,8 @@ exaPixmapShouldBeInFB (PixmapPtr pPix)
|
||||||
static void
|
static void
|
||||||
exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
|
exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
|
||||||
Bool (*transfer) (PixmapPtr pPix, int x, int y, int w, int h,
|
Bool (*transfer) (PixmapPtr pPix, int x, int y, int w, int h,
|
||||||
char *sys, int sys_pitch), CARD8 *fallback_src,
|
char *sys, int sys_pitch), int fallback_index,
|
||||||
CARD8 *fallback_dst, int fallback_srcpitch, int fallback_dstpitch,
|
void (*sync) (ScreenPtr pScreen))
|
||||||
int fallback_index, void (*sync) (ScreenPtr pScreen))
|
|
||||||
{
|
{
|
||||||
PixmapPtr pPixmap = migrate->pPix;
|
PixmapPtr pPixmap = migrate->pPix;
|
||||||
ExaPixmapPriv (pPixmap);
|
ExaPixmapPriv (pPixmap);
|
||||||
|
@ -228,9 +227,15 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc,
|
||||||
ExaDoPrepareAccess(pPixmap, fallback_index);
|
ExaDoPrepareAccess(pPixmap, fallback_index);
|
||||||
access_prepared = TRUE;
|
access_prepared = TRUE;
|
||||||
}
|
}
|
||||||
exaMemcpyBox (pPixmap, pBox,
|
if (fallback_index == EXA_PREPARE_DEST) {
|
||||||
fallback_src, fallback_srcpitch,
|
exaMemcpyBox (pPixmap, pBox,
|
||||||
fallback_dst, fallback_dstpitch);
|
pExaPixmap->sys_ptr, pExaPixmap->sys_pitch,
|
||||||
|
pPixmap->devPrivate.ptr, pPixmap->devKind);
|
||||||
|
} else {
|
||||||
|
exaMemcpyBox (pPixmap, pBox,
|
||||||
|
pPixmap->devPrivate.ptr, pPixmap->devKind,
|
||||||
|
pExaPixmap->sys_ptr, pExaPixmap->sys_pitch);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
need_sync = TRUE;
|
need_sync = TRUE;
|
||||||
|
|
||||||
|
@ -271,9 +276,8 @@ exaCopyDirtyToSys (ExaMigrationPtr migrate)
|
||||||
ExaPixmapPriv (pPixmap);
|
ExaPixmapPriv (pPixmap);
|
||||||
|
|
||||||
exaCopyDirty(migrate, &pExaPixmap->validSys, &pExaPixmap->validFB,
|
exaCopyDirty(migrate, &pExaPixmap->validSys, &pExaPixmap->validFB,
|
||||||
pExaScr->info->DownloadFromScreen, pExaPixmap->fb_ptr,
|
pExaScr->info->DownloadFromScreen, EXA_PREPARE_SRC,
|
||||||
pExaPixmap->sys_ptr, pExaPixmap->fb_pitch,
|
exaWaitSync);
|
||||||
pExaPixmap->sys_pitch, EXA_PREPARE_SRC, exaWaitSync);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -289,9 +293,7 @@ exaCopyDirtyToFb (ExaMigrationPtr migrate)
|
||||||
ExaPixmapPriv (pPixmap);
|
ExaPixmapPriv (pPixmap);
|
||||||
|
|
||||||
exaCopyDirty(migrate, &pExaPixmap->validFB, &pExaPixmap->validSys,
|
exaCopyDirty(migrate, &pExaPixmap->validFB, &pExaPixmap->validSys,
|
||||||
pExaScr->info->UploadToScreen, pExaPixmap->sys_ptr,
|
pExaScr->info->UploadToScreen, EXA_PREPARE_DEST, NULL);
|
||||||
pExaPixmap->fb_ptr, pExaPixmap->sys_pitch,
|
|
||||||
pExaPixmap->fb_pitch, EXA_PREPARE_DEST, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue