xf86-video-intel: src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna.h src/sna/sna_io.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Oct 25 06:24:57 PDT 2013


 src/sna/sna.h       |    2 -
 src/sna/sna_accel.c |    6 ----
 src/sna/sna_blt.c   |   23 +++++++---------
 src/sna/sna_io.c    |   74 +++++++++++++++++++++++++++-------------------------
 4 files changed, 51 insertions(+), 54 deletions(-)

New commits:
commit f0da01aa907d488ae32dfda206ea8a66564bc430
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 14:22:05 2013 +0100

    sna: Remove stale mappings when replacing GPU bo
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=70527
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 0796a37..243f795 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -892,11 +892,9 @@ bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
 
 bool sna_replace(struct sna *sna,
 		 PixmapPtr pixmap,
-		 struct kgem_bo **bo,
 		 const void *src, int stride);
 bool sna_replace__xor(struct sna *sna,
 		      PixmapPtr pixmap,
-		      struct kgem_bo **bo,
 		      const void *src, int stride,
 		      uint32_t and, uint32_t or);
 
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a1de360..9a78375 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3110,7 +3110,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 				    box->x2 >= pixmap->drawable.width &&
 				    box->y2 >= pixmap->drawable.height) {
 					ok = sna_replace(sna, pixmap,
-							 &priv->gpu_bo,
 							 pixmap->devPrivate.ptr,
 							 pixmap->devKind);
 				} else {
@@ -3857,7 +3856,6 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			    (box->x2 - box->x1) >= pixmap->drawable.width &&
 			    (box->y2 - box->y1) >= pixmap->drawable.height) {
 				ok = sna_replace(sna, pixmap,
-						 &priv->gpu_bo,
 						 pixmap->devPrivate.ptr,
 						 pixmap->devKind);
 			} else {
@@ -5891,9 +5889,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 				bits = src_pixmap->devPrivate.ptr;
 				bits += (src_dy + box->y1) * stride + (src_dx + box->x1) * bpp / 8;
 
-				if (!sna_replace(sna, dst_pixmap,
-						 &dst_priv->gpu_bo,
-						 bits, stride)) {
+				if (!sna_replace(sna, dst_pixmap, bits, stride)) {
 					DBG(("%s: replace failed, fallback\n", __FUNCTION__));
 					goto fallback;
 				}
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index c773868..8a6814c 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1710,8 +1710,7 @@ blt_put_composite(struct sna *sna,
 		data += (src_y - dst_y) * pitch;
 
 		assert(op->dst.bo == dst_priv->gpu_bo);
-		sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-			    data, pitch);
+		sna_replace(sna, op->dst.pixmap, data, pitch);
 	} else {
 		BoxRec box;
 		bool ok;
@@ -1752,8 +1751,7 @@ fastcall static void blt_put_composite_box(struct sna *sna,
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
 		assert(op->dst.bo == dst_priv->gpu_bo);
-		sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-			    data, pitch);
+		sna_replace(sna, op->dst.pixmap, data, pitch);
 	} else {
 		bool ok;
 
@@ -1791,8 +1789,7 @@ static void blt_put_composite_boxes(struct sna *sna,
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
 		assert(op->dst.bo == dst_priv->gpu_bo);
-		sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-			    data, pitch);
+		sna_replace(sna, op->dst.pixmap, data, pitch);
 	} else {
 		bool ok;
 
@@ -1833,8 +1830,8 @@ blt_put_composite_with_alpha(struct sna *sna,
 		data += (src_y - dst_y) * pitch;
 
 		assert(op->dst.bo == dst_priv->gpu_bo);
-		sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-				 data, pitch, 0xffffffff, op->u.blt.pixel);
+		sna_replace__xor(sna, op->dst.pixmap, data, pitch,
+				 0xffffffff, op->u.blt.pixel);
 	} else {
 		BoxRec box;
 
@@ -1874,8 +1871,8 @@ blt_put_composite_box_with_alpha(struct sna *sna,
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
 		assert(op->dst.bo == dst_priv->gpu_bo);
-		sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-				 data, pitch, 0xffffffff, op->u.blt.pixel);
+		sna_replace__xor(sna, op->dst.pixmap, data, pitch,
+				 0xffffffff, op->u.blt.pixel);
 	} else {
 		sna_write_boxes__xor(sna, op->dst.pixmap,
 				     op->dst.bo, op->dst.x, op->dst.y,
@@ -1911,8 +1908,8 @@ blt_put_composite_boxes_with_alpha(struct sna *sna,
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
 		assert(dst_priv->gpu_bo == op->dst.bo);
-		sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo,
-				 data, pitch, 0xffffffff, op->u.blt.pixel);
+		sna_replace__xor(sna, op->dst.pixmap, data, pitch,
+				 0xffffffff, op->u.blt.pixel);
 	} else {
 		sna_write_boxes__xor(sna, op->dst.pixmap,
 				     op->dst.bo, op->dst.x, op->dst.y,
@@ -1931,6 +1928,8 @@ prepare_blt_put(struct sna *sna,
 {
 	DBG(("%s\n", __FUNCTION__));
 
+	assert(!sna_pixmap(op->dst.pixmap)->clear);
+
 	if (op->dst.bo) {
 		assert(op->dst.bo == sna_pixmap(op->dst.pixmap)->gpu_bo);
 		if (alpha_fixup) {
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 78951ca..ee5debf 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1472,13 +1472,11 @@ indirect_replace(struct sna *sna,
 	return ret;
 }
 
-bool sna_replace(struct sna *sna,
-		 PixmapPtr pixmap,
-		 struct kgem_bo **_bo,
+bool sna_replace(struct sna *sna, PixmapPtr pixmap,
 		 const void *src, int stride)
 {
-	struct kgem_bo *bo = *_bo;
-	struct kgem *kgem = &sna->kgem;
+	struct sna_pixmap *priv = sna_pixmap(pixmap);
+	struct kgem_bo *bo = priv->gpu_bo;
 	void *dst;
 
 	assert(bo);
@@ -1488,19 +1486,19 @@ bool sna_replace(struct sna *sna,
 	     pixmap->drawable.height,
 	     pixmap->drawable.bitsPerPixel,
 	     bo->tiling,
-	     __kgem_bo_is_busy(kgem, bo)));
+	     __kgem_bo_is_busy(&sna->kgem, bo)));
 
-	assert(!sna_pixmap(pixmap)->pinned);
+	assert(!priv->pinned);
 
-	kgem_bo_undo(kgem, bo);
+	kgem_bo_undo(&sna->kgem, bo);
 
-	if (__kgem_bo_is_busy(kgem, bo)) {
+	if (__kgem_bo_is_busy(&sna->kgem, bo)) {
 		struct kgem_bo *new_bo;
 
 		if (indirect_replace(sna, pixmap, bo, src, stride))
 			return true;
 
-		new_bo = kgem_create_2d(kgem,
+		new_bo = kgem_create_2d(&sna->kgem,
 					pixmap->drawable.width,
 					pixmap->drawable.height,
 					pixmap->drawable.bitsPerPixel,
@@ -1511,26 +1509,26 @@ bool sna_replace(struct sna *sna,
 	}
 
 	if (bo->tiling == I915_TILING_NONE && bo->pitch == stride &&
-	    kgem_bo_write(kgem, bo, src,
+	    kgem_bo_write(&sna->kgem, bo, src,
 			  (pixmap->drawable.height-1)*stride + pixmap->drawable.width*pixmap->drawable.bitsPerPixel/8))
 			goto done;
 
-	if (upload_inplace__tiled(kgem, bo)) {
+	if (upload_inplace__tiled(&sna->kgem, bo)) {
 		BoxRec box;
 
 		box.x1 = box.y1 = 0;
 		box.x2 = pixmap->drawable.width;
 		box.y2 = pixmap->drawable.height;
 
-		if (write_boxes_inplace__tiled(kgem, src,
+		if (write_boxes_inplace__tiled(&sna->kgem, src,
 					       stride, pixmap->drawable.bitsPerPixel, 0, 0,
 					       bo, 0, 0, &box, 1))
 			goto done;
 	}
 
 	sigtrap_assert();
-	if (kgem_bo_is_mappable(kgem, bo) &&
-	    (dst = kgem_bo_map(kgem, bo)) != NULL &&
+	if (kgem_bo_is_mappable(&sna->kgem, bo) &&
+	    (dst = kgem_bo_map(&sna->kgem, bo)) != NULL &&
 	    sigtrap_get() == 0) {
 		memcpy_blt(src, dst, pixmap->drawable.bitsPerPixel,
 			   stride, bo->pitch,
@@ -1554,26 +1552,27 @@ bool sna_replace(struct sna *sna,
 	}
 
 done:
-	if (bo != *_bo)
-		kgem_bo_destroy(kgem, *_bo);
-	*_bo = bo;
+	if (bo != priv->gpu_bo) {
+		sna_pixmap_unmap(pixmap, priv);
+		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+		priv->gpu_bo = bo;
+	}
+
 	return true;
 
 err:
-	if (bo != *_bo)
-		kgem_bo_destroy(kgem, bo);
+	if (bo != priv->gpu_bo)
+		kgem_bo_destroy(&sna->kgem, bo);
 	return false;
 }
 
 bool
-sna_replace__xor(struct sna *sna,
-		 PixmapPtr pixmap,
-		 struct kgem_bo **_bo,
+sna_replace__xor(struct sna *sna, PixmapPtr pixmap,
 		 const void *src, int stride,
 		 uint32_t and, uint32_t or)
 {
-	struct kgem_bo *bo = *_bo;
-	struct kgem *kgem = &sna->kgem;
+	struct sna_pixmap *priv = sna_pixmap(pixmap);
+	struct kgem_bo *bo = priv->gpu_bo;
 	void *dst;
 
 	DBG(("%s(handle=%d, %dx%d, bpp=%d, tiling=%d)\n",
@@ -1583,25 +1582,27 @@ sna_replace__xor(struct sna *sna,
 	     pixmap->drawable.bitsPerPixel,
 	     bo->tiling));
 
-	assert(!sna_pixmap(pixmap)->pinned);
+	assert(!priv->pinned);
+
+	kgem_bo_undo(&sna->kgem, bo);
 
 	if (kgem_bo_is_busy(bo)) {
 		struct kgem_bo *new_bo;
 
-		new_bo = kgem_create_2d(kgem,
+		new_bo = kgem_create_2d(&sna->kgem,
 					pixmap->drawable.width,
 					pixmap->drawable.height,
 					pixmap->drawable.bitsPerPixel,
 					bo->tiling,
 					CREATE_GTT_MAP | CREATE_INACTIVE);
 		if (new_bo) {
-			kgem_bo_destroy(kgem, bo);
+			kgem_bo_destroy(&sna->kgem, bo);
 			bo = new_bo;
 		}
 	}
 
-	if (kgem_bo_is_mappable(kgem, bo) &&
-	    (dst = kgem_bo_map(kgem, bo)) != NULL &&
+	if (kgem_bo_is_mappable(&sna->kgem, bo) &&
+	    (dst = kgem_bo_map(&sna->kgem, bo)) != NULL &&
 	    sigtrap_get() == 0) {
 		memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,
 			   stride, bo->pitch,
@@ -1626,13 +1627,16 @@ sna_replace__xor(struct sna *sna,
 			goto err;
 	}
 
-	if (bo != *_bo)
-		kgem_bo_destroy(kgem, *_bo);
-	*_bo = bo;
+	if (bo != priv->gpu_bo) {
+		sna_pixmap_unmap(pixmap, priv);
+		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+		priv->gpu_bo = bo;
+	}
+
 	return true;
 
 err:
-	if (bo != *_bo)
-		kgem_bo_destroy(kgem, bo);
+	if (bo != priv->gpu_bo)
+		kgem_bo_destroy(&sna->kgem, bo);
 	return false;
 }


More information about the xorg-commit mailing list