xf86-video-intel: 9 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/kgem.c src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Oct 29 02:34:42 PDT 2011


 src/sna/gen2_render.c |    3 
 src/sna/gen3_render.c |    3 
 src/sna/gen4_render.c |    3 
 src/sna/gen5_render.c |    3 
 src/sna/gen6_render.c |    3 
 src/sna/gen7_render.c |    3 
 src/sna/kgem.c        |   13 ++
 src/sna/sna_accel.c   |  321 +++++++++++++++++++++++++++++++++-----------------
 8 files changed, 239 insertions(+), 113 deletions(-)

New commits:
commit 719626ef7918d5cd69d13f983b8b615aefe215d6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Oct 29 10:26:08 2011 +0100

    sna: Increment clip box when short-circuiting the iteration
    
    Reported-by: nkalkhof at web.de
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index fead5a1..3c1a65e 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1968,10 +1968,12 @@ no_damage_clipped:
 					if (y + 1 <= c->y1)
 						break;
 
-					if (X2 <= c->x1)
-						continue;
 					if (X1 >= c->x2)
 						break;
+					if (X2 <= c->x1) {
+						c++;
+						continue;
+					}
 
 					b->x1 = c->x1;
 					b->x2 = c->x2;
@@ -1981,6 +1983,8 @@ no_damage_clipped:
 						b->x1 = X1;
 					if (b->x2 > X2)
 						b->x2 = X2;
+					if (b->x2 <= b->x1)
+						continue;
 
 					b->x1 += dx;
 					b->x2 += dx;
@@ -2073,10 +2077,12 @@ damage_clipped:
 					if (y + 1 <= c->y1)
 						break;
 
-					if (X2 <= c->x1)
-						continue;
 					if (X1 >= c->x2)
 						break;
+					if (X2 <= c->x1) {
+						c++;
+						continue;
+					}
 
 					b->x1 = c->x1;
 					b->x2 = c->x2;
@@ -2086,6 +2092,8 @@ damage_clipped:
 						b->x1 = X1;
 					if (b->x2 > X2)
 						b->x2 = X2;
+					if (b->x2 <= b->x1)
+						continue;
 
 					b->x1 += dx;
 					b->x2 += dx;
commit 32a9e0352a1e28509580d84bfc5377d8fae913c4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 23:14:24 2011 +0100

    sna: Retire and search inactive again before creating new buffer
    
    Attempt to retire an active buffer into the inactive cache before giving
    up and creating a new buffer.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e8df7d9..4827fb8 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1270,6 +1270,13 @@ struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size)
 	if (bo)
 		return kgem_bo_reference(bo);
 
+	if (!list_is_empty(&kgem->requests)) {
+		kgem_retire(kgem);
+		bo = search_linear_cache(kgem, size, false);
+		if (bo)
+			return kgem_bo_reference(bo);
+	}
+
 	handle = gem_create(kgem->fd, size);
 	if (handle == 0)
 		return NULL;
@@ -1541,6 +1548,12 @@ next_bo:
 		continue;
 	}
 
+	if (flags & CREATE_INACTIVE && !list_is_empty(&kgem->requests)) {
+		kgem_retire(kgem);
+		flags &= ~CREATE_INACTIVE;
+		goto skip_active_search;
+	}
+
 	handle = gem_create(kgem->fd, size);
 	if (handle == 0)
 		return NULL;
commit 15266e1b9500f6b348661c60d1982bde911f2d0e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 18:00:56 2011 +0100

    sna: Don't flush the render caches if in the process of writing again
    
    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 9e85176..e76876c 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1375,7 +1375,8 @@ gen2_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) {
 		if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 2b70b85..118b906 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2479,7 +2479,8 @@ gen3_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) {
 		if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
 			kgem_emit_flush(&sna->kgem);
 		} else {
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e4a40fc..425967b 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2058,7 +2058,8 @@ gen4_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
 		kgem_emit_flush(&sna->kgem);
 
 	gen4_bind_surfaces(sna, tmp);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index a177d32..6d4fbd9 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2078,7 +2078,8 @@ gen5_render_composite(struct sna *sna,
 			   tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
 		kgem_emit_flush(&sna->kgem);
 
 	gen5_bind_surfaces(sna, tmp);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0dde625..1abb54f 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2248,7 +2248,8 @@ gen6_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
 		kgem_emit_flush(&sna->kgem);
 
 	gen6_emit_composite_state(sna, tmp);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index b9f23ee..7eb323f 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2388,7 +2388,8 @@ gen7_render_composite(struct sna *sna,
 			   NULL))
 		kgem_submit(&sna->kgem);
 
-	if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+	if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+	    (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
 		kgem_emit_flush(&sna->kgem);
 
 	gen7_emit_composite_state(sna, tmp);
commit d3c7ee921172d4898ebdc6e944812a02426008e9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 16:44:16 2011 +0100

    sna: Faster unclipped rectilinear segments
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4b1e536..fead5a1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3332,51 +3332,95 @@ sna_poly_segment_blt(DrawablePtr drawable,
 	if (!clipped) {
 		dx += drawable->x;
 		dy += drawable->y;
-		do {
-			int x, y, width, height;
+		if (dx|dy) {
+			do {
+				int nbox = n;
+				if (nbox > ARRAY_SIZE(boxes))
+					nbox = ARRAY_SIZE(boxes);
+				n -= nbox;
+				do {
+					if (seg->x1 < seg->x2) {
+						b->x1 = seg->x1;
+						b->x2 = seg->x2;
+					} else {
+						b->x1 = seg->x2;
+						b->x2 = seg->x1;
+					}
+					b->x2++;
 
-			if (seg->x1 < seg->x2) {
-				x = seg->x1;
-				width = seg->x2;
-			} else {
-				x = seg->x2;
-				width = seg->x1;
-			}
-			width -= x - 1;
+					if (seg->y1 < seg->y2) {
+						b->y1 = seg->y1;
+						b->y2 = seg->y2;
+					} else {
+						b->y1 = seg->y2;
+						b->y2 = seg->y1;
+					}
+					b->y2++;
 
-			if (seg->y1 < seg->y2) {
-				y = seg->y1;
-				height = seg->y2;
-			} else {
-				y = seg->y2;
-				height = seg->y1;
-			}
-			height -= y - 1;
-
-			/* don't paint last pixel */
-			if (gc->capStyle == CapNotLast) {
-				if (width == 1)
-					height--;
-				else
-					width--;
-			}
+					/* don't paint last pixel */
+					if (gc->capStyle == CapNotLast) {
+						if (seg->x1 == seg->x2)
+							b->y2--;
+						else
+							b->x2--;
+					}
 
-			DBG(("%s: [%d] (%d, %d)x(%d, %d) + (%d, %d)\n", __FUNCTION__, n,
-			     x, y, width, height, dx, dy));
+					b->x1 += dx;
+					b->x2 += dx;
+					b->y1 += dy;
+					b->y2 += dy;
+					b++;
+					seg++;
+				} while (--nbox);
 
-			b->x1 = x + dx;
-			b->x2 = b->x1 + width;
-			b->y1 = y + dy;
-			b->y2 = b->y1 + height;
-			if (++b == last_box) {
-				fill.boxes(sna, &fill, boxes, last_box-boxes);
+				fill.boxes(sna, &fill, boxes, b-boxes);
 				if (damage)
-					sna_damage_add_boxes(damage, boxes, last_box-boxes, 0, 0);
+					sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
 				b = boxes;
-			}
+			} while (n);
+		} else {
+			do {
+				int nbox = n;
+				if (nbox > ARRAY_SIZE(boxes))
+					nbox = ARRAY_SIZE(boxes);
+				n -= nbox;
+				do {
+					if (seg->x1 < seg->x2) {
+						b->x1 = seg->x1;
+						b->x2 = seg->x2;
+					} else {
+						b->x1 = seg->x2;
+						b->x2 = seg->x1;
+					}
+					b->x2++;
 
-			seg++;
-		} while (--n);
+					if (seg->y1 < seg->y2) {
+						b->y1 = seg->y1;
+						b->y2 = seg->y2;
+					} else {
+						b->y1 = seg->y2;
+						b->y2 = seg->y1;
+					}
+					b->y2++;
+
+					/* don't paint last pixel */
+					if (gc->capStyle == CapNotLast) {
+						if (seg->x1 == seg->x2)
+							b->y2--;
+						else
+							b->x2--;
+					}
+
+					b++;
+					seg++;
+				} while (--nbox);
+
+				fill.boxes(sna, &fill, boxes, b-boxes);
+				if (damage)
+					sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
+				b = boxes;
+			} while (n);
+		}
 	} else {
 		RegionRec clip;
 
commit 3cd909cfe9e7d7e97a1d51513a049e312fd9ddae
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 15:48:49 2011 +0100

    sna: Call miZeroArcLine where appropriate for GPU paths
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 96f0e05..4b1e536 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4683,13 +4683,18 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc *arc)
 	if (USE_SPANS && arc_to_spans(gc, n) && can_fill_spans(drawable, gc) &&
 	    sna_drawable_use_gpu_bo(drawable, &region.extents)) {
 		DBG(("%s: converting arcs into spans\n", __FUNCTION__));
-		miPolyArc(drawable, gc, n, arc);
+		/* XXX still around 10x slower for x11perf -ellipse */
+		if (gc->lineWidth == 0)
+			miZeroPolyArc(drawable, gc, n, arc);
+		else
+			miPolyArc(drawable, gc, n, arc);
 		return;
 	}
 
 fallback:
 	DBG(("%s -- fallback\n", __FUNCTION__));
 	if (gc->lineWidth) {
+		DBG(("%s -- miPolyArc\n", __FUNCTION__));
 		miPolyArc(drawable, gc, n, arc);
 		return;
 	}
commit 9921c98df070032e082570f0663f6d3ad0cccd56
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 14:09:11 2011 +0100

    sna: Faster unclipped PolyFillRect
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9f00fd6..96f0e05 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4765,17 +4765,41 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
 		dy += drawable->y;
 
 		sna_damage_add_rectangles(damage, rect, n, dx, dy);
-		do {
-			b->x1 = rect->x + dx;
-			b->y1 = rect->y + dy;
-			b->x2 = b->x1 + rect->width;
-			b->y2 = b->y1 + rect->height;
-			rect++;
-			if (++b == last_box) {
-				fill.boxes(sna, &fill, boxes, last_box-boxes);
+		if (dx|dy) {
+			do {
+				int nbox = n;
+				if (nbox > ARRAY_SIZE(boxes))
+					nbox = ARRAY_SIZE(boxes);
+				n -= nbox;
+				do {
+					b->x1 = rect->x + dx;
+					b->y1 = rect->y + dy;
+					b->x2 = b->x1 + rect->width;
+					b->y2 = b->y1 + rect->height;
+					b++;
+					rect++;
+				} while (--nbox);
+				fill.boxes(sna, &fill, boxes, b-boxes);
 				b = boxes;
-			}
-		} while (--n);
+			} while (n);
+		} else {
+			do {
+				int nbox = n;
+				if (nbox > ARRAY_SIZE(boxes))
+					nbox = ARRAY_SIZE(boxes);
+				n -= nbox;
+				do {
+					b->x1 = rect->x;
+					b->y1 = rect->y;
+					b->x2 = b->x1 + rect->width;
+					b->y2 = b->y1 + rect->height;
+					b++;
+					rect++;
+				} while (--nbox);
+				fill.boxes(sna, &fill, boxes, b-boxes);
+				b = boxes;
+			} while (n);
+		}
 	} else {
 		RegionRec clip;
 
commit c1718f96f520874c1fb2af0eb975c7f548762d34
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 14:01:24 2011 +0100

    sna: Faster unclipped PolyPoint
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 61fe190..9f00fd6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2387,26 +2387,25 @@ sna_poly_point_blt(DrawablePtr drawable,
 
 		sna_damage_add_points(damage, pt, n, last.x, last.y);
 		do {
-			b->x1 = pt->x;
-			b->y1 = pt->y;
-			pt++;
+			int nbox = n;
+			if (nbox > ARRAY_SIZE(box))
+				nbox = ARRAY_SIZE(box);
+			n -= nbox;
+			do {
+				*(DDXPointRec *)b = *pt++;
 
-			b->x1 += last.x;
-			b->y1 += last.y;
-			if (mode == CoordModePrevious) {
-				last.x = b->x1;
-				last.y = b->y1;
-			}
+				b->x1 += last.x;
+				b->y1 += last.y;
+				if (mode == CoordModePrevious)
+					last = *(DDXPointRec *)b;
 
-			b->x2 = b->x1 + 1;
-			b->y2 = b->y1 + 1;
-			if (++b == last_box) {
-				fill.boxes(sna, &fill, box, last_box - box);
-				b = box;
-			}
-		} while (--n);
-		if (b != box)
+				b->x2 = b->x1 + 1;
+				b->y2 = b->y1 + 1;
+				b++;
+			} while (--nbox);
 			fill.boxes(sna, &fill, box, b - box);
+			b = box;
+		} while (n);
 	} else {
 		while (n--) {
 			int x, y;
@@ -4846,9 +4845,9 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
 		}
 
 		RegionUninit(&clip);
+		if (b != boxes)
+			fill.boxes(sna, &fill, boxes, b-boxes);
 	}
-	if (b != boxes)
-		fill.boxes(sna, &fill, boxes, b-boxes);
 done:
 	fill.done(sna, &fill);
 	return TRUE;
commit a4762ed891a50238abddf6c762a053db5c34b87f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 13:39:17 2011 +0100

    sna: Call directly into tiled rects for tiled spans.
    
    As we already know the extents and that this is a candidate for
    GPU-acceleration, we can skip over those steps and emit the tiled rects.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 2a9f2a4..61fe190 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2182,8 +2182,12 @@ reduce_damage(DrawablePtr drawable,
 		return damage;
 }
 
-static void
-sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, xRectangle *rect);
+static Bool
+sna_poly_fill_rect_tiled(DrawablePtr drawable,
+			 struct kgem_bo *bo,
+			 struct sna_damage **damage,
+			 GCPtr gc, int n, xRectangle *rect,
+			 const BoxRec *extents, unsigned clipped);
 
 static bool
 can_fill_spans(DrawablePtr drawable, GCPtr gc)
@@ -2253,26 +2257,36 @@ sna_fill_spans(DrawablePtr drawable, GCPtr gc, int n,
 				       &region.extents, flags & 2))
 			return;
 	} else if (gc->fillStyle == FillTiled) {
-		xRectangle *rect;
-		int i;
-
 		/* Try converting these to a set of rectangles instead */
-		DBG(("%s: converting to rectagnles\n", __FUNCTION__));
 
-		rect = malloc (n * sizeof (xRectangle));
-		if (rect == NULL)
-			return;
+		if (sna_drawable_use_gpu_bo(drawable, &region.extents)) {
+			struct sna_pixmap *priv = sna_pixmap_from_drawable(drawable);
+			xRectangle *rect;
+			int i;
 
-		for (i = 0; i < n; i++) {
-			rect[i].x = pt[i].x;
-			rect[i].width = width[i];
-			rect[i].y = pt[i].y;
-			rect[i].height = 1;
-		}
+			DBG(("%s: converting to rectagnles\n", __FUNCTION__));
 
-		sna_poly_fill_rect(drawable, gc, n, rect);
-		free (rect);
-		return;
+			rect = malloc (n * sizeof (xRectangle));
+			if (rect == NULL)
+				return;
+
+			for (i = 0; i < n; i++) {
+				rect[i].x = pt[i].x;
+				rect[i].width = width[i];
+				rect[i].y = pt[i].y;
+				rect[i].height = 1;
+			}
+
+			i = sna_poly_fill_rect_tiled(drawable,
+						     priv->gpu_bo,
+						     priv->gpu_only ? NULL : reduce_damage(drawable, &priv->gpu_damage, &region.extents),
+						     gc, n, rect,
+						     &region.extents, flags & 2);
+			free (rect);
+
+			if (i)
+				return;
+		}
 	}
 
 fallback:
commit a02069df2ddc259d65ad468834f7968d283b713f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Oct 28 11:30:37 2011 +0100

    sna: Faster unclipped spans
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 31f4013..2a9f2a4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1837,24 +1837,38 @@ no_damage_translate:
 	dx += drawable->x;
 	dy += drawable->y;
 no_damage:
-	{
-		unsigned offset = dx|dy;
+	if (dx|dy) {
 		do {
-			*(DDXPointRec *)b = *pt++;
-			if (offset) {
+			int nbox = n;
+			if (nbox > last_box - box)
+				nbox = last_box - box;
+			n -= nbox;
+			do {
+				*(DDXPointRec *)b = *pt++;
 				b->x1 += dx;
 				b->y1 += dy;
-			}
-			b->x2 = b->x1 + (int)*width++;
-			b->y2 = b->y1 + 1;
-
-			if (++b == last_box) {
-				fill.boxes(sna, &fill, box, last_box - box);
-				b = box;
-			}
-		} while (--n);
-		if (b != box)
+				b->x2 = b->x1 + (int)*width++;
+				b->y2 = b->y1 + 1;
+				b++;
+			} while (--nbox);
 			fill.boxes(sna, &fill, box, b - box);
+			b = box;
+		} while (n);
+	} else {
+		do {
+			int nbox = n;
+			if (nbox > last_box - box)
+				nbox = last_box - box;
+			n -= nbox;
+			do {
+				*(DDXPointRec *)b = *pt++;
+				b->x2 = b->x1 + (int)*width++;
+				b->y2 = b->y1 + 1;
+				b++;
+			} while (--nbox);
+			fill.boxes(sna, &fill, box, b - box);
+			b = box;
+		} while (n);
 	}
 	goto done;
 
@@ -2192,9 +2206,8 @@ sna_fill_spans(DrawablePtr drawable, GCPtr gc, int n,
 	RegionRec region;
 	unsigned flags;
 
-	DBG(("%s(n=%d, pt[0]=(%d, %d)\n",
-	     __FUNCTION__, n, pt[0].x, pt[0].y));
-
+	DBG(("%s(n=%d, pt[0]=(%d, %d)+%d, sorted=%d\n",
+	     __FUNCTION__, n, pt[0].x, pt[0].y, width[0], sorted));
 
 	flags = sna_spans_extents(drawable, gc, n, pt, width, &region.extents);
 	if (flags == 0)


More information about the xorg-commit mailing list