diff options
author | Eric Anholt <eric@anholt.net> | 2014-02-28 13:02:18 -0500 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@gmail.com> | 2014-03-13 21:52:28 +0800 |
commit | 3eb7ba02f337806a613f2afd0cbe724435dd9308 (patch) | |
tree | 159dd1bef29d9d3d08629bc9714afbbc4ac0ca94 | |
parent | 6f16980babbb184ba83927de2db71449b4a3389f (diff) |
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.
Ported from Eric's xserver glamor tree.
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/glamor_copyarea.c | 4 | ||||
-rw-r--r-- | src/glamor_copyplane.c | 4 | ||||
-rw-r--r-- | src/glamor_putimage.c | 4 | ||||
-rw-r--r-- | src/glamor_setspans.c | 4 |
4 files changed, 12 insertions, 4 deletions
diff --git a/src/glamor_copyarea.c b/src/glamor_copyarea.c index 435d832..d52a74c 100644 --- a/src/glamor_copyarea.c +++ b/src/glamor_copyarea.c @@ -633,10 +633,12 @@ fall_back: glamor_get_drawable_location(dst)); 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, dx, dy, reverse, upsidedown, bitplane, closure); } + glamor_finish_access_gc(gc); glamor_finish_access(src); glamor_finish_access(dst); ok = TRUE; diff --git a/src/glamor_copyplane.c b/src/glamor_copyplane.c index 65d3244..0278a0f 100644 --- a/src/glamor_copyplane.c +++ b/src/glamor_copyplane.c @@ -40,10 +40,12 @@ _glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, goto fail; 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, dstx, dsty, bitPlane); } + glamor_finish_access_gc(pGC); glamor_finish_access(pSrc); glamor_finish_access(pDst); return TRUE; diff --git a/src/glamor_putimage.c b/src/glamor_putimage.c index 9202e54..e4f9082 100644 --- a/src/glamor_putimage.c +++ b/src/glamor_putimage.c @@ -229,10 +229,12 @@ glamor_put_image_xybitmap(DrawablePtr drawable, GCPtr gc, glamor_fallback(": to %p (%c)\n", drawable, glamor_get_drawable_location(drawable)); 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); } + glamor_finish_access_gc(gc); glamor_finish_access(drawable); } #endif diff --git a/src/glamor_setspans.c b/src/glamor_setspans.c index 1349f80..b1abfee 100644 --- a/src/glamor_setspans.c +++ b/src/glamor_setspans.c @@ -84,9 +84,11 @@ fail: glamor_fallback("to %p (%c)\n", 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); } + glamor_finish_access_gc(gc); glamor_finish_access(drawable); ret = TRUE; |