xf86-video-intel: 4 commits - src/sna/gen2_render.c src/sna/kgem.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 05:20:37 PDT 2013


 src/sna/gen2_render.c |    1 
 src/sna/kgem.c        |   17 ++++++----
 src/sna/sna.h         |   12 +++----
 src/sna/sna_blt.c     |   29 ++++++++++-------
 src/sna/sna_io.c      |   82 ++++++++++++++++++++++++++++++--------------------
 5 files changed, 85 insertions(+), 56 deletions(-)

New commits:
commit 4e4d643794975b2ac90d04f1a11c0b8114699559
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 13:20:10 2013 +0100

    sna: Fix overallocation of fences for BLT commands (gen2/3)
    
    Fixes a regression introduced in
    commit 4d2840919fd00e4ae0bf1957f66009f55a01eb7b
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Thu Sep 26 15:30:58 2013 +0100
    
        sna: In desperation, query the actual available aperture space
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 2ee534d..a0ba8ca 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1487,6 +1487,7 @@ gen2_composite_picture(struct sna *sna,
 	channel->is_opaque = false;
 	channel->is_affine = true;
 	channel->transform = NULL;
+	channel->card_format = -1;
 
 	if (sna_picture_is_solid(picture, &color))
 		return gen2_composite_solid_init(sna, channel, color);
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index d60c430..38017dd 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4725,6 +4725,8 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		if (kgem->gen < 040 &&
 		    bo->tiling != I915_TILING_NONE &&
 		    (bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+			assert(bo->tiling == I915_TILING_X);
+
 			if (kgem->nfence >= kgem->fence_max)
 				return false;
 
@@ -4749,14 +4751,10 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		return false;
 	}
 
-	if (kgem->aperture + num_pages(bo) > kgem->aperture_high) {
-		DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
-		     __FUNCTION__, num_pages(bo) + kgem->aperture, kgem->aperture_high));
-		return aperture_check(kgem, num_pages(bo));
-	}
-
 	assert_tiling(kgem, bo);
 	if (kgem->gen < 040 && bo->tiling != I915_TILING_NONE) {
+		assert(bo->tiling == I915_TILING_X);
+
 		if (kgem->nfence >= kgem->fence_max)
 			return false;
 
@@ -4770,6 +4768,12 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 			return false;
 	}
 
+	if (kgem->aperture + num_pages(bo) > kgem->aperture_high) {
+		DBG(("%s: final aperture usage (%d) is greater than high water mark (%d)\n",
+		     __FUNCTION__, num_pages(bo) + kgem->aperture, kgem->aperture_high));
+		return aperture_check(kgem, num_pages(bo));
+	}
+
 	return kgem_flush(kgem, bo->flush);
 }
 
@@ -4894,6 +4898,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
 		if (kgem->gen < 040 && read_write_domain & KGEM_RELOC_FENCED) {
 			if (bo->tiling &&
 			    (bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+				assert(bo->tiling == I915_TILING_X);
 				assert(kgem->nfence < kgem->fence_max);
 				kgem->aperture_fenced +=
 					kgem_bo_fenced_size(kgem, bo);
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 6cab2a4..c773868 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2646,6 +2646,10 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu,
 		_kgem_set_mode(kgem, KGEM_BLT);
 	}
 
+	assert(kgem_check_batch(kgem, 6));
+	assert(kgem_check_reloc(kgem, 1));
+	assert(kgem_check_bo_fenced(kgem, bo));
+
 	b = kgem->batch + kgem->nbatch;
 	b[0] = cmd;
 	b[1] = br13;
commit da0de7e55a9c1b64f3fb0d7b573bb61b0d2566df
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 11:35:39 2013 +0100

    sna: Add a line of DBG for when we discard uploads into CPU bo
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 0dd5793..6cab2a4 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2279,6 +2279,7 @@ fill:
 
 put:
 		if (tmp->dst.bo == sna_pixmap(tmp->dst.pixmap)->cpu_bo) {
+			DBG(("%s: dropping upload into CPU bo\n", __FUNCTION__));
 			tmp->dst.bo = NULL;
 			tmp->damage = NULL;
 		}
commit 51c87f9acaa0c4eaaea581092088e1d524396f35
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 11:23:21 2013 +0100

    sna/io: Propagate failure to XOR uploads
    
    Similar to the handling required for the normal upload paths.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 304f712..0796a37 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -884,7 +884,7 @@ bool sna_write_boxes(struct sna *sna, PixmapPtr dst,
 		     struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
 		     const void *src, int stride, int16_t src_dx, int16_t src_dy,
 		     const BoxRec *box, int n);
-void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
+bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
 			  struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
 			  const void *src, int stride, int16_t src_dx, int16_t src_dy,
 			  const BoxRec *box, int nbox,
@@ -894,11 +894,11 @@ bool sna_replace(struct sna *sna,
 		 PixmapPtr pixmap,
 		 struct kgem_bo **bo,
 		 const void *src, int stride);
-struct kgem_bo *sna_replace__xor(struct sna *sna,
-				 PixmapPtr pixmap,
-				 struct kgem_bo *bo,
-				 const void *src, int stride,
-				 uint32_t and, uint32_t or);
+bool sna_replace__xor(struct sna *sna,
+		      PixmapPtr pixmap,
+		      struct kgem_bo **bo,
+		      const void *src, int stride,
+		      uint32_t and, uint32_t or);
 
 bool
 sna_compute_composite_extents(BoxPtr extents,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index fdcc419..0dd5793 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1709,6 +1709,7 @@ blt_put_composite(struct sna *sna,
 		data += (src_x - dst_x) * bpp / 8;
 		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);
 	} else {
@@ -1750,6 +1751,7 @@ fastcall static void blt_put_composite_box(struct sna *sna,
 		data += (box->y1 + op->u.blt.sy) * pitch;
 		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);
 	} else {
@@ -1788,6 +1790,7 @@ static void blt_put_composite_boxes(struct sna *sna,
 		data += (box->y1 + op->u.blt.sy) * pitch;
 		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);
 	} else {
@@ -1829,10 +1832,9 @@ blt_put_composite_with_alpha(struct sna *sna,
 		data += (src_x - dst_x) * bpp;
 		data += (src_y - dst_y) * pitch;
 
-		dst_priv->gpu_bo =
-			sna_replace__xor(sna, op->dst.pixmap, dst_priv->gpu_bo,
-					 data, pitch,
-					 0xffffffff, op->u.blt.pixel);
+		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);
 	} else {
 		BoxRec box;
 
@@ -1871,10 +1873,9 @@ blt_put_composite_box_with_alpha(struct sna *sna,
 		data += (box->y1 + op->u.blt.sy) * pitch;
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
-		dst_priv->gpu_bo =
-			sna_replace__xor(sna, op->dst.pixmap, op->dst.bo,
-					 data, pitch,
-					 0xffffffff, op->u.blt.pixel);
+		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);
 	} else {
 		sna_write_boxes__xor(sna, op->dst.pixmap,
 				     op->dst.bo, op->dst.x, op->dst.y,
@@ -1909,10 +1910,9 @@ blt_put_composite_boxes_with_alpha(struct sna *sna,
 		data += (box->y1 + op->u.blt.sy) * pitch;
 		data += (box->x1 + op->u.blt.sx) * bpp;
 
-		dst_priv->gpu_bo =
-			sna_replace__xor(sna, op->dst.pixmap, op->dst.bo,
-					 data, pitch,
-					 0xffffffff, op->u.blt.pixel);
+		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);
 	} else {
 		sna_write_boxes__xor(sna, op->dst.pixmap,
 				     op->dst.bo, op->dst.x, op->dst.y,
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 578442d..78951ca 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1032,7 +1032,7 @@ fallback:
 				   box, nbox);
 }
 
-static void
+static bool
 write_boxes_inplace__xor(struct kgem *kgem,
 			 const void *src, int stride, int bpp, int16_t src_dx, int16_t src_dy,
 			 struct kgem_bo *bo, int16_t dst_dx, int16_t dst_dy,
@@ -1047,11 +1047,11 @@ write_boxes_inplace__xor(struct kgem *kgem,
 
 	dst = kgem_bo_map(kgem, bo);
 	if (dst == NULL)
-		return;
+		return false;
 
 	sigtrap_assert();
 	if (sigtrap_get())
-		return;
+		return false;
 
 	do {
 		DBG(("%s: (%d, %d) -> (%d, %d) x (%d, %d) [bpp=%d, src_pitch=%d, dst_pitch=%d]\n", __FUNCTION__,
@@ -1082,6 +1082,7 @@ write_boxes_inplace__xor(struct kgem *kgem,
 	} while (--n);
 
 	sigtrap_put();
+	return true;
 }
 
 static bool upload_inplace__xor(struct kgem *kgem,
@@ -1098,7 +1099,7 @@ static bool upload_inplace__xor(struct kgem *kgem,
 	return __upload_inplace(kgem, bo, box, n, bpp);
 }
 
-void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
+bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
 			  struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
 			  const void *src, int stride, int16_t src_dx, int16_t src_dy,
 			  const BoxRec *box, int nbox,
@@ -1116,12 +1117,11 @@ void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst,
 
 	if (upload_inplace__xor(kgem, dst_bo, box, nbox, dst->drawable.bitsPerPixel)) {
 fallback:
-		write_boxes_inplace__xor(kgem,
-					 src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy,
-					 dst_bo, dst_dx, dst_dy,
-					 box, nbox,
-					 and, or);
-		return;
+		return write_boxes_inplace__xor(kgem,
+						src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy,
+						dst_bo, dst_dx, dst_dy,
+						box, nbox,
+						and, or);
 	}
 
 	can_blt = kgem_bo_can_blt(kgem, dst_bo) &&
@@ -1294,7 +1294,7 @@ tile:
 				goto tile;
 		}
 
-		return;
+		return true;
 	}
 
 	cmd = XY_SRC_COPY_BLT_CMD;
@@ -1410,6 +1410,7 @@ tile:
 	} while (nbox);
 
 	sna->blt_state.fill_bo = 0;
+	return true;
 }
 
 static bool
@@ -1564,12 +1565,14 @@ err:
 	return false;
 }
 
-struct kgem_bo *sna_replace__xor(struct sna *sna,
-				 PixmapPtr pixmap,
-				 struct kgem_bo *bo,
-				 const void *src, int stride,
-				 uint32_t and, uint32_t or)
+bool
+sna_replace__xor(struct sna *sna,
+		 PixmapPtr pixmap,
+		 struct kgem_bo **_bo,
+		 const void *src, int stride,
+		 uint32_t and, uint32_t or)
 {
+	struct kgem_bo *bo = *_bo;
 	struct kgem *kgem = &sna->kgem;
 	void *dst;
 
@@ -1615,12 +1618,21 @@ struct kgem_bo *sna_replace__xor(struct sna *sna,
 		box.x2 = pixmap->drawable.width;
 		box.y2 = pixmap->drawable.height;
 
-		sna_write_boxes__xor(sna, pixmap,
-				     bo, 0, 0,
-				     src, stride, 0, 0,
-				     &box, 1,
-				     and, or);
+		if (!sna_write_boxes__xor(sna, pixmap,
+					  bo, 0, 0,
+					  src, stride, 0, 0,
+					  &box, 1,
+					  and, or))
+			goto err;
 	}
 
-	return bo;
+	if (bo != *_bo)
+		kgem_bo_destroy(kgem, *_bo);
+	*_bo = bo;
+	return true;
+
+err:
+	if (bo != *_bo)
+		kgem_bo_destroy(kgem, bo);
+	return false;
 }
commit 51590e55c0187862174a7dd5775915216b3137a6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 25 11:03:05 2013 +0100

    sna/io: Wrap the XOR upload paths with SIGBUS handling
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 0988d3d..578442d 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -1049,6 +1049,10 @@ write_boxes_inplace__xor(struct kgem *kgem,
 	if (dst == NULL)
 		return;
 
+	sigtrap_assert();
+	if (sigtrap_get())
+		return;
+
 	do {
 		DBG(("%s: (%d, %d) -> (%d, %d) x (%d, %d) [bpp=%d, src_pitch=%d, dst_pitch=%d]\n", __FUNCTION__,
 		     box->x1 + src_dx, box->y1 + src_dy,
@@ -1076,6 +1080,8 @@ write_boxes_inplace__xor(struct kgem *kgem,
 			   and, or);
 		box++;
 	} while (--n);
+
+	sigtrap_put();
 }
 
 static bool upload_inplace__xor(struct kgem *kgem,
@@ -1591,17 +1597,17 @@ struct kgem_bo *sna_replace__xor(struct sna *sna,
 		}
 	}
 
-	if (kgem_bo_is_mappable(kgem, bo)) {
-		dst = kgem_bo_map(kgem, bo);
-		if (dst) {
-			memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,
-				   stride, bo->pitch,
-				   0, 0,
-				   0, 0,
-				   pixmap->drawable.width,
-				   pixmap->drawable.height,
-				   and, or);
-		}
+	if (kgem_bo_is_mappable(kgem, bo) &&
+	    (dst = kgem_bo_map(kgem, bo)) != NULL &&
+	    sigtrap_get() == 0) {
+		memcpy_xor(src, dst, pixmap->drawable.bitsPerPixel,
+			   stride, bo->pitch,
+			   0, 0,
+			   0, 0,
+			   pixmap->drawable.width,
+			   pixmap->drawable.height,
+			   and, or);
+		sigtrap_put();
 	} else {
 		BoxRec box;
 


More information about the xorg-commit mailing list