[Glamor] [PATCH 23/34] glamor: Add missing prepares on the GC during fb fallbacks.

Alex Deucher alexdeucher at gmail.com
Fri Feb 28 10:02:18 PST 2014


From: Eric Anholt <eric at anholt.net>

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 at anholt.net>
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
---
 src/glamor_copyarea.c  | 4 +++-
 src/glamor_copyplane.c | 4 +++-
 src/glamor_putimage.c  | 4 +++-
 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;
 
-- 
1.8.3.1



More information about the Glamor mailing list