xf86-video-intel: 2 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_accel.c src/sna/sna_render.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Oct 9 17:07:39 PDT 2013


 src/sna/gen2_render.c |    2 +-
 src/sna/gen3_render.c |    2 +-
 src/sna/gen4_render.c |    2 +-
 src/sna/gen5_render.c |    2 +-
 src/sna/gen6_render.c |   26 ++++++++++++++++++++------
 src/sna/gen7_render.c |   27 ++++++++++++++++++++-------
 src/sna/sna_accel.c   |   48 +++++++++++++++++++++++++++++-------------------
 src/sna/sna_render.c  |    2 +-
 src/sna/sna_render.h  |    5 ++++-
 9 files changed, 78 insertions(+), 38 deletions(-)

New commits:
commit 97d809c26bec2c0120f2dc0bcfd840379bd996fa
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Oct 10 00:15:55 2013 +0100

    sna: Pass usage hint down to render fill routines
    
    For the scanlines emitted for rendering Core drawing primitives, it is
    preferable to use the BLT engine, so pass those hints down.
    
    Reported-by: Jiri Slaby <jirislaby at gmail.com>
    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 9ae8352..2ee534d 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -2943,7 +2943,7 @@ gen2_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
 static bool
 gen2_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *tmp)
 {
 #if NO_FILL
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 2445b91..cec35f4 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -6045,7 +6045,7 @@ gen3_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
 static bool
 gen3_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *tmp)
 {
 #if NO_FILL
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 48a8852..fe13873 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2716,7 +2716,7 @@ gen4_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
 static bool
 gen4_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *op)
 {
 	if (sna_blt_fill(sna, alu,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index ca41a9a..a0ef9b6 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2802,7 +2802,7 @@ gen5_render_fill_op_done(struct sna *sna,
 static bool
 gen5_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *op)
 {
 	DBG(("%s(alu=%d, color=%08x)\n", __FUNCTION__, alu, color));
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 401041c..3773c27 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3110,11 +3110,15 @@ gen6_emit_fill_state(struct sna *sna, const struct sna_composite_op *op)
 }
 
 static inline bool prefer_blt_fill(struct sna *sna,
-				   struct kgem_bo *bo)
+				   struct kgem_bo *bo,
+				   unsigned flags)
 {
 	if (PREFER_RENDER)
 		return PREFER_RENDER < 0;
 
+	if (flags & (FILL_POINTS | FILL_SPANS))
+		return true;
+
 	if (untiled_tlb_miss(bo))
 		return true;
 
@@ -3154,7 +3158,8 @@ gen6_render_fill_boxes(struct sna *sna,
 		return false;
 	}
 
-	if (prefer_blt_fill(sna, dst_bo) || !gen6_check_dst_format(format)) {
+	if (prefer_blt_fill(sna, dst_bo, FILL_BOXES) ||
+	    !gen6_check_dst_format(format)) {
 		uint8_t alu = GXinvalid;
 
 		if (op <= PictOpSrc) {
@@ -3365,12 +3370,12 @@ gen6_render_op_fill_done(struct sna *sna, const struct sna_fill_op *op)
 static bool
 gen6_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *op)
 {
 	DBG(("%s: (alu=%d, color=%x)\n", __FUNCTION__, alu, color));
 
-	if (prefer_blt_fill(sna, dst_bo) &&
+	if (prefer_blt_fill(sna, dst_bo, flags) &&
 	    sna_blt_fill(sna, alu,
 			 dst_bo, dst->drawable.bitsPerPixel,
 			 color,
@@ -3454,7 +3459,7 @@ gen6_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 	int16_t *v;
 
 	/* Prefer to use the BLT if already engaged */
-	if (prefer_blt_fill(sna, bo) &&
+	if (prefer_blt_fill(sna, bo, FILL_BOXES) &&
 	    gen6_render_fill_one_try_blt(sna, dst, bo, color,
 					 x1, y1, x2, y2, alu))
 		return true;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index e17fc94..37eb8dd 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3346,8 +3346,12 @@ gen7_emit_fill_state(struct sna *sna, const struct sna_composite_op *op)
 }
 
 static inline bool prefer_blt_fill(struct sna *sna,
-				   struct kgem_bo *bo)
+				   struct kgem_bo *bo,
+				   unsigned flags)
 {
+	if (flags & (FILL_POINTS | FILL_SPANS))
+		return true;
+
 	if (untiled_tlb_miss(bo))
 		return true;
 
@@ -3387,7 +3391,8 @@ gen7_render_fill_boxes(struct sna *sna,
 		return false;
 	}
 
-	if (prefer_blt_fill(sna, dst_bo) || !gen7_check_dst_format(format)) {
+	if (prefer_blt_fill(sna, dst_bo, FILL_BOXES) ||
+	    !gen7_check_dst_format(format)) {
 		uint8_t alu = GXinvalid;
 
 		if (op <= PictOpSrc) {
@@ -3593,12 +3598,12 @@ gen7_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op)
 static bool
 gen7_render_fill(struct sna *sna, uint8_t alu,
 		 PixmapPtr dst, struct kgem_bo *dst_bo,
-		 uint32_t color,
+		 uint32_t color, unsigned flags,
 		 struct sna_fill_op *op)
 {
 	DBG(("%s: (alu=%d, color=%x)\n", __FUNCTION__, alu, color));
 
-	if (prefer_blt_fill(sna, dst_bo) &&
+	if (prefer_blt_fill(sna, dst_bo, flags) &&
 	    sna_blt_fill(sna, alu,
 			 dst_bo, dst->drawable.bitsPerPixel,
 			 color,
@@ -3680,7 +3685,7 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 	int16_t *v;
 
 	/* Prefer to use the BLT if already engaged */
-	if (prefer_blt_fill(sna, bo) &&
+	if (prefer_blt_fill(sna, bo, FILL_BOXES) &&
 	    gen7_render_fill_one_try_blt(sna, dst, bo, color,
 					 x1, y1, x2, y2, alu))
 		return true;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 7891a5f..21bda10 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -422,9 +422,10 @@ sna_fill_init_blt(struct sna_fill_op *fill,
 		  PixmapPtr pixmap,
 		  struct kgem_bo *bo,
 		  uint8_t alu,
-		  uint32_t pixel)
+		  uint32_t pixel,
+		  unsigned flags)
 {
-	return sna->render.fill(sna, alu, pixmap, bo, pixel, fill);
+	return sna->render.fill(sna, alu, pixmap, bo, pixel, flags, fill);
 }
 
 static bool
@@ -5418,7 +5419,8 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 
 				if (!sna_fill_init_blt(&fill, sna,
 						       dst_pixmap, bo,
-						       alu, src_priv->clear_color)) {
+						       alu, src_priv->clear_color,
+						       FILL_BOXES)) {
 					DBG(("%s: unsupported fill\n",
 					     __FUNCTION__));
 					goto fallback;
@@ -6140,7 +6142,8 @@ sna_poly_point__gpu(DrawablePtr drawable, GCPtr gc,
 
 	if (!sna_fill_init_blt(&fill,
 			       data->sna, data->pixmap,
-			       data->bo, gc->alu, gc->fgPixel))
+			       data->bo, gc->alu, gc->fgPixel,
+			       FILL_POINTS))
 		return;
 
 	DBG(("%s: count=%d\n", __FUNCTION__, n));
@@ -6541,7 +6544,7 @@ sna_fill_spans_blt(DrawablePtr drawable,
 	DBG(("%s: alu=%d, fg=%08lx, damge=%p, clipped?=%d\n",
 	     __FUNCTION__, gc->alu, gc->fgPixel, damage, clipped));
 
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_SPANS))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -7625,7 +7628,7 @@ sna_poly_point_blt(DrawablePtr drawable,
 	DBG(("%s: alu=%d, pixel=%08lx, clipped?=%d\n",
 	     __FUNCTION__, gc->alu, gc->fgPixel, clipped));
 
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_POINTS))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -7841,7 +7844,7 @@ sna_poly_zero_line_blt(DrawablePtr drawable,
 
 	DBG(("%s: alu=%d, pixel=%lx, n=%d, clipped=%d, damage=%p\n",
 	     __FUNCTION__, gc->alu, gc->fgPixel, _n, clipped, damage));
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_SPANS))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -8212,7 +8215,7 @@ sna_poly_line_blt(DrawablePtr drawable,
 
 	DBG(("%s: alu=%d, fg=%08x\n", __FUNCTION__, gc->alu, (unsigned)pixel));
 
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_BOXES))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -8709,7 +8712,8 @@ spans_fallback:
 			if (gc->lineStyle == LineSolid) {
 				if (!sna_fill_init_blt(&fill,
 						       data.sna, data.pixmap,
-						       data.bo, gc->alu, color))
+						       data.bo, gc->alu, color,
+						       FILL_POINTS | FILL_SPANS))
 					goto fallback;
 
 				data.op = &fill;
@@ -8768,7 +8772,8 @@ spans_fallback:
 				DBG(("%s: miZeroLine (solid dash)\n", __FUNCTION__));
 				if (!sna_fill_init_blt(&fill,
 						       data.sna, data.pixmap,
-						       data.bo, gc->alu, color))
+						       data.bo, gc->alu, color,
+						       FILL_POINTS | FILL_SPANS))
 					goto fallback;
 
 				gc->ops = &sna_gc_ops__tmp;
@@ -8778,7 +8783,8 @@ spans_fallback:
 				if (sna_fill_init_blt(&fill,
 						       data.sna, data.pixmap,
 						       data.bo, gc->alu,
-						       gc->bgPixel)) {
+						       gc->bgPixel,
+						       FILL_POINTS | FILL_SPANS)) {
 					miZeroDashLine(drawable, gc, mode, n, pt);
 					fill.done(data.sna, &fill);
 				}
@@ -8911,7 +8917,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
 	DBG(("%s: n=%d, alu=%d, fg=%08lx, clipped=%d\n",
 	     __FUNCTION__, n, gc->alu, gc->fgPixel, clipped));
 
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_SPANS))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -9065,7 +9071,7 @@ sna_poly_zero_segment_blt(DrawablePtr drawable,
 
 	DBG(("%s: alu=%d, pixel=%lx, n=%d, clipped=%d, damage=%p\n",
 	     __FUNCTION__, gc->alu, gc->fgPixel, _n, clipped, damage));
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_BOXES))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -9628,7 +9634,8 @@ spans_fallback:
 
 			if (!sna_fill_init_blt(&fill,
 					       data.sna, data.pixmap,
-					       data.bo, gc->alu, color))
+					       data.bo, gc->alu, color,
+					       FILL_POINTS | FILL_SPANS))
 				goto fallback;
 
 			data.op = &fill;
@@ -9773,7 +9780,7 @@ sna_poly_rectangle_blt(DrawablePtr drawable,
 
 	DBG(("%s: n=%d, alu=%d, width=%d, fg=%08lx, damge=%p, clipped?=%d\n",
 	     __FUNCTION__, n, gc->alu, gc->lineWidth, gc->fgPixel, damage, clipped));
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_BOXES))
 		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -10428,7 +10435,8 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc *arc)
 
 				if (!sna_fill_init_blt(&fill,
 						       data.sna, data.pixmap,
-						       data.bo, gc->alu, color))
+						       data.bo, gc->alu, color,
+						       FILL_POINTS | FILL_SPANS))
 					goto fallback;
 
 				if ((data.flags & 2) == 0) {
@@ -10595,7 +10603,7 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
 		return success;
 	}
 
-	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel)) {
+	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_BOXES)) {
 		DBG(("%s: unsupported blt\n", __FUNCTION__));
 		return false;
 	}
@@ -10804,7 +10812,8 @@ sna_poly_fill_polygon(DrawablePtr draw, GCPtr gc,
 
 			if (!sna_fill_init_blt(&fill,
 					       data.sna, data.pixmap,
-					       data.bo, gc->alu, color))
+					       data.bo, gc->alu, color,
+					       FILL_SPANS))
 				goto fallback;
 
 			data.op = &fill;
@@ -13252,7 +13261,8 @@ sna_poly_fill_arc(DrawablePtr draw, GCPtr gc, int n, xArc *arc)
 
 			if (!sna_fill_init_blt(&fill,
 					       data.sna, data.pixmap,
-					       data.bo, gc->alu, color))
+					       data.bo, gc->alu, color,
+					       FILL_SPANS))
 				goto fallback;
 
 			data.op = &fill;
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index f584ee4..6f13c21 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -203,7 +203,7 @@ no_render_fill_boxes(struct sna *sna,
 static bool
 no_render_fill(struct sna *sna, uint8_t alu,
 	       PixmapPtr dst, struct kgem_bo *dst_bo,
-	       uint32_t color,
+	       uint32_t color, unsigned flags,
 	       struct sna_fill_op *tmp)
 {
 	DBG(("%s (alu=%d, color=%08x)\n", __FUNCTION__, alu, color));
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 7f4b8e6..0262523 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -255,8 +255,11 @@ struct sna_render {
 			   const BoxRec *box, int n);
 	bool (*fill)(struct sna *sna, uint8_t alu,
 		     PixmapPtr dst, struct kgem_bo *dst_bo,
-		     uint32_t color,
+		     uint32_t color, unsigned flags,
 		     struct sna_fill_op *tmp);
+#define FILL_BOXES 0x1
+#define FILL_POINTS 0x2
+#define FILL_SPANS 0x4
 	bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo,
 			 uint32_t color,
 			 int16_t x1, int16_t y1, int16_t x2, int16_t y2,
commit b16999da214803a026d7246ec4aa62031e82dfc8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 9 23:54:57 2013 +0100

    sna: Upon unwinding operations, also check for exec objects to clear
    
    If we cancel an operation after partially committing it, we may leave
    the batch bookkeeping in an inconsistent state with an exec object with
    a zero-length batch. Ordinarily, this would not be an issue as we could
    pass the extra object to the next batch. However, if we switch rings, we
    need to clear the extra objects as they are currently flagged as being
    on the wrong ring, leading to hilarity.
    
    Reported-by: Jiri Slaby <jirislaby at gmail.com>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index ee1686f..401041c 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3622,10 +3622,19 @@ gen6_render_context_switch(struct kgem *kgem,
 			   int new_mode)
 {
 	if (kgem->nbatch) {
-		DBG(("%s: from %d to %d\n", __FUNCTION__, kgem->mode, new_mode));
+		DBG(("%s: from %d to %d, submit batch\n", __FUNCTION__, kgem->mode, new_mode));
 		_kgem_submit(kgem);
 	}
 
+	if (kgem->nexec) {
+		DBG(("%s: from %d to %d, reset incomplete batch\n", __FUNCTION__, kgem->mode, new_mode));
+		kgem_reset(kgem);
+	}
+
+	assert(kgem->nbatch == 0);
+	assert(kgem->nreloc == 0);
+	assert(kgem->nexec == 0);
+
 	kgem->ring = new_mode;
 }
 
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 30e1cc1..e17fc94 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3844,11 +3844,19 @@ gen7_render_context_switch(struct kgem *kgem,
 			   int new_mode)
 {
 	if (kgem->nbatch) {
-		DBG(("%s: switch rings %d -> %d\n",
-		     __FUNCTION__, kgem->mode, new_mode));
+		DBG(("%s: from %d to %d, submit batch\n", __FUNCTION__, kgem->mode, new_mode));
 		_kgem_submit(kgem);
 	}
 
+	if (kgem->nexec) {
+		DBG(("%s: from %d to %d, reset incomplete batch\n", __FUNCTION__, kgem->mode, new_mode));
+		kgem_reset(kgem);
+	}
+
+	assert(kgem->nbatch == 0);
+	assert(kgem->nreloc == 0);
+	assert(kgem->nexec == 0);
+
 	kgem->ring = new_mode;
 }
 


More information about the xorg-commit mailing list