xf86-video-intel: 2 commits - src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Jan 19 01:55:33 PST 2012


 src/sna/sna_accel.c |   65 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 38 insertions(+), 27 deletions(-)

New commits:
commit ff2eb116ef85182eea9ed06daaa1e9a4f7bdbad3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 18 00:56:07 2012 +0000

    sna: Micro-optimise line extents for zero line width
    
    Handling zero line widths is the common case, so avoid the extra work.
    
    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 79555e5..08889f8 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5192,19 +5192,11 @@ sna_poly_line_extents(DrawablePtr drawable, GCPtr gc,
 		      BoxPtr out)
 {
 	BoxRec box;
-	int extra = gc->lineWidth >> 1;
 	bool clip, blt = true;
 
 	if (n == 0)
 		return 0;
 
-	if (n > 1) {
-		if (gc->joinStyle == JoinMiter)
-			extra = 6 * gc->lineWidth;
-		else if (gc->capStyle == CapProjecting)
-			extra = gc->lineWidth;
-	}
-
 	box.x2 = box.x1 = pt->x;
 	box.y2 = box.y1 = pt->y;
 	if (mode == CoordModePrevious) {
@@ -5234,11 +5226,20 @@ sna_poly_line_extents(DrawablePtr drawable, GCPtr gc,
 	box.x2++;
 	box.y2++;
 
-	if (extra) {
-		box.x1 -= extra;
-		box.x2 += extra;
-		box.y1 -= extra;
-		box.y2 += extra;
+	if (gc->lineWidth) {
+		int extra = gc->lineWidth >> 1;
+		if (n > 1) {
+			if (gc->joinStyle == JoinMiter)
+				extra = 6 * gc->lineWidth;
+			else if (gc->capStyle == CapProjecting)
+				extra = gc->lineWidth;
+		}
+		if (extra) {
+			box.x1 -= extra;
+			box.x2 += extra;
+			box.y1 -= extra;
+			box.y2 += extra;
+		}
 	}
 
 	clip = trim_and_translate_box(&box, drawable, gc);
commit 3c010745076204ed3b66e947c9eab6de84f670fe
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 19 09:46:52 2012 +0000

    sna: filter out degenerate segments whilst drawing unclipped PolySegment
    
    The damage layer was detecting that we were asking it to accumulate a
    degenerate box emanating from PolySegment, as the unclipped paths made
    the fatal assumption that it would not need to filter out degenerate
    boxes. However, a degenerate line becomes a point, does the same apply
    to a degenerate segment?
    
    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 0f21ffa..79555e5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5534,18 +5534,25 @@ sna_poly_segment_blt(DrawablePtr drawable,
 							b->x2--;
 					}
 
-					b->x1 += dx;
-					b->x2 += dx;
-					b->y1 += dy;
-					b->y2 += dy;
-					b++;
+					/* XXX does a degenerate segment
+					 * become a point?
+					 */
+					if (b->y2 > b->y1 && b->x2 > b->x1) {
+						b->x1 += dx;
+						b->x2 += dx;
+						b->y1 += dy;
+						b->y2 += dy;
+						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;
+				if (b != boxes) {
+					fill.boxes(sna, &fill, boxes, b-boxes);
+					if (damage)
+						sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
+					b = boxes;
+				}
 			} while (n);
 		} else {
 			do {
@@ -5580,14 +5587,17 @@ sna_poly_segment_blt(DrawablePtr drawable,
 							b->x2--;
 					}
 
-					b++;
+					if (b->y2 > b->y1 && b->x2 > b->x1)
+						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;
+				if (b != boxes) {
+					fill.boxes(sna, &fill, boxes, b-boxes);
+					if (damage)
+						sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
+					b = boxes;
+				}
 			} while (n);
 		}
 	} else {


More information about the xorg-commit mailing list