summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-02-28 13:02:18 -0500
committerZhigang Gong <zhigang.gong@gmail.com>2014-03-13 21:52:28 +0800
commit3eb7ba02f337806a613f2afd0cbe724435dd9308 (patch)
tree159dd1bef29d9d3d08629bc9714afbbc4ac0ca94
parent6f16980babbb184ba83927de2db71449b4a3389f (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.c4
-rw-r--r--src/glamor_copyplane.c4
-rw-r--r--src/glamor_putimage.c4
-rw-r--r--src/glamor_setspans.c4
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;