glamor: Add missing prepares on the GC during fb fallbacks.
We had regressions in CopyPlane reported by xts5, because we were (successfully!) dereferencing the null pixmap->devPrivate.ptr for a tile or stipple without having done a prepare. Signed-off-by: Eric Anholt <eric@anholt.net> Reviewed-by: Markus Wick <markus@selfnet.de>
This commit is contained in:
parent
93f1824a0b
commit
ab68982dcc
|
@ -571,10 +571,12 @@ _glamor_copy_n_to_n(DrawablePtr src,
|
||||||
glamor_get_drawable_location(dst));
|
glamor_get_drawable_location(dst));
|
||||||
|
|
||||||
if (glamor_prepare_access(dst, GLAMOR_ACCESS_RW) &&
|
if (glamor_prepare_access(dst, GLAMOR_ACCESS_RW) &&
|
||||||
glamor_prepare_access(src, GLAMOR_ACCESS_RO)) {
|
glamor_prepare_access(src, GLAMOR_ACCESS_RO) &&
|
||||||
|
glamor_prepare_access_gc(gc)) {
|
||||||
fbCopyNtoN(src, dst, gc, box, nbox,
|
fbCopyNtoN(src, dst, gc, box, nbox,
|
||||||
dx, dy, reverse, upsidedown, bitplane, closure);
|
dx, dy, reverse, upsidedown, bitplane, closure);
|
||||||
}
|
}
|
||||||
|
glamor_finish_access_gc(gc);
|
||||||
glamor_finish_access(src);
|
glamor_finish_access(src);
|
||||||
glamor_finish_access(dst);
|
glamor_finish_access(dst);
|
||||||
ok = TRUE;
|
ok = TRUE;
|
||||||
|
|
|
@ -39,10 +39,12 @@ _glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (glamor_prepare_access(pDst, GLAMOR_ACCESS_RW) &&
|
if (glamor_prepare_access(pDst, GLAMOR_ACCESS_RW) &&
|
||||||
glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO)) {
|
glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO) &&
|
||||||
|
glamor_prepare_access_gc(pGC)) {
|
||||||
*pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h,
|
*pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h,
|
||||||
dstx, dsty, bitPlane);
|
dstx, dsty, bitPlane);
|
||||||
}
|
}
|
||||||
|
glamor_finish_access_gc(pGC);
|
||||||
glamor_finish_access(pSrc);
|
glamor_finish_access(pSrc);
|
||||||
glamor_finish_access(pDst);
|
glamor_finish_access(pDst);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -227,9 +227,11 @@ glamor_put_image_xybitmap(DrawablePtr drawable, GCPtr gc,
|
||||||
glamor_fallback(": to %p (%c)\n",
|
glamor_fallback(": to %p (%c)\n",
|
||||||
drawable, glamor_get_drawable_location(drawable));
|
drawable, glamor_get_drawable_location(drawable));
|
||||||
fail:
|
fail:
|
||||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) &&
|
||||||
|
glamor_prepare_access_gc(gc)) {
|
||||||
fbPutImage(drawable, gc, 1, x, y, w, h, left_pad, XYBitmap, bits);
|
fbPutImage(drawable, gc, 1, x, y, w, h, left_pad, XYBitmap, bits);
|
||||||
}
|
}
|
||||||
|
glamor_finish_access_gc(gc);
|
||||||
glamor_finish_access(drawable);
|
glamor_finish_access(drawable);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -86,9 +86,11 @@ _glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
|
||||||
|
|
||||||
glamor_fallback("to %p (%c)\n",
|
glamor_fallback("to %p (%c)\n",
|
||||||
drawable, glamor_get_drawable_location(drawable));
|
drawable, glamor_get_drawable_location(drawable));
|
||||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW) &&
|
||||||
|
glamor_prepare_access_gc(gc)) {
|
||||||
fbSetSpans(drawable, gc, src, points, widths, numPoints, sorted);
|
fbSetSpans(drawable, gc, src, points, widths, numPoints, sorted);
|
||||||
}
|
}
|
||||||
|
glamor_finish_access_gc(gc);
|
||||||
glamor_finish_access(drawable);
|
glamor_finish_access(drawable);
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user