xf86-video-intel: 3 commits - uxa/uxa-accel.c

Eric Anholt anholt at kemper.freedesktop.org
Sun Jun 5 21:15:05 PDT 2011


 uxa/uxa-accel.c |  223 +++++++++++++++++---------------------------------------
 1 file changed, 68 insertions(+), 155 deletions(-)

New commits:
commit 91424d49373d8117e71441fa3221bd1801171692
Author: Eric Anholt <eric at anholt.net>
Date:   Tue May 31 23:29:43 2011 -0700

    uxa: Simplify uxa_poly_fill_rect by only clipping once.
    
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 8f6da63..dd83542 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -785,10 +785,7 @@ uxa_poly_fill_rect(DrawablePtr pDrawable,
 	RegionPtr pClip = fbGetCompositeClip(pGC);
 	PixmapPtr pPixmap;
 	register BoxPtr pbox;
-	BoxPtr pextent;
-	int extentX1, extentX2, extentY1, extentY2;
 	int fullX1, fullX2, fullY1, fullY2;
-	int partX1, partX2, partY1, partY2;
 	int xoff, yoff;
 	int xorg, yorg;
 	int n;
@@ -850,11 +847,6 @@ fallback:
 	xorg = pDrawable->x;
 	yorg = pDrawable->y;
 
-	pextent = REGION_EXTENTS(pGC->pScreen, pClip);
-	extentX1 = pextent->x1;
-	extentY1 = pextent->y1;
-	extentX2 = pextent->x2;
-	extentY2 = pextent->y2;
 	while (nrect--) {
 		fullX1 = prect->x + xorg;
 		fullY1 = prect->y + yorg;
@@ -862,62 +854,37 @@ fallback:
 		fullY2 = fullY1 + (int)prect->height;
 		prect++;
 
-		if (fullX1 < extentX1)
-			fullX1 = extentX1;
-
-		if (fullY1 < extentY1)
-			fullY1 = extentY1;
+		n = REGION_NUM_RECTS(pClip);
+		pbox = REGION_RECTS(pClip);
+		/*
+		 * clip the rectangle to each box in the clip region
+		 * this is logically equivalent to calling Intersect(),
+		 * but rectangles may overlap each other here.
+		 */
+		while (n--) {
+			int x1 = fullX1;
+			int x2 = fullX2;
+			int y1 = fullY1;
+			int y2 = fullY2;
 
-		if (fullX2 > extentX2)
-			fullX2 = extentX2;
+			if (pbox->x1 > x1)
+				x1 = pbox->x1;
+			if (pbox->x2 < x2)
+				x2 = pbox->x2;
+			if (pbox->y1 > y1)
+				y1 = pbox->y1;
+			if (pbox->y2 < y2)
+				y2 = pbox->y2;
+			pbox++;
 
-		if (fullY2 > extentY2)
-			fullY2 = extentY2;
+			if (x1 >= x2 || y1 >= y2)
+				continue;
 
-		if ((fullX1 >= fullX2) || (fullY1 >= fullY2))
-			continue;
-		n = REGION_NUM_RECTS(pClip);
-		if (n == 1) {
 			(*uxa_screen->info->solid) (pPixmap,
-						    fullX1 + xoff,
-						    fullY1 + yoff,
-						    fullX2 + xoff,
-						    fullY2 + yoff);
-		} else {
-			pbox = REGION_RECTS(pClip);
-			/*
-			 * clip the rectangle to each box in the clip region
-			 * this is logically equivalent to calling Intersect(),
-			 * but rectangles may overlap each other here.
-			 */
-			while (n--) {
-				partX1 = pbox->x1;
-				if (partX1 < fullX1)
-					partX1 = fullX1;
-				partY1 = pbox->y1;
-				if (partY1 < fullY1)
-					partY1 = fullY1;
-				partX2 = pbox->x2;
-				if (partX2 > fullX2)
-					partX2 = fullX2;
-				partY2 = pbox->y2;
-				if (partY2 > fullY2)
-					partY2 = fullY2;
-
-				pbox++;
-
-				if (partX1 < partX2 && partY1 < partY2) {
-					(*uxa_screen->info->solid) (pPixmap,
-								    partX1 +
-								    xoff,
-								    partY1 +
-								    yoff,
-								    partX2 +
-								    xoff,
-								    partY2 +
-								    yoff);
-				}
-			}
+						    x1 + xoff,
+						    y1 + yoff,
+						    x2 + xoff,
+						    y2 + yoff);
 		}
 	}
 	(*uxa_screen->info->done_solid) (pPixmap);
commit e0066e77e026b0dd0daa0c3765473c7d63aa6753
Author: Eric Anholt <eric at anholt.net>
Date:   Tue May 31 23:17:16 2011 -0700

    uxa: Simplify Composite solid acceleration for spans by only clipping once.
    
    Unlike the previous commit removing this style of code, the code in
    this one was originally wrong, and would fail to clip in the second
    pass of clipping when y was > pbox->y2.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=37233
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 31c37e8..8f6da63 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -63,11 +63,9 @@ uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n,
 	uxa_screen_t *uxa_screen = uxa_get_screen(screen);
 	RegionPtr pClip = fbGetCompositeClip(pGC);
 	PixmapPtr dst_pixmap, src_pixmap = NULL;
-	BoxPtr pextent, pbox;
+	BoxPtr pbox;
 	int nbox;
-	int extentX1, extentX2, extentY1, extentY2;
-	int x1, x2, y, fullX1, fullX2, fullY1;
-	int partX1, partX2;
+	int x1, x2, y;
 	int off_x, off_y;
 	xRenderColor color;
 	PictFormatPtr format;
@@ -142,62 +140,35 @@ uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n,
 		goto solid;
 	}
 
-	pextent = REGION_EXTENTS(pGC->screen, pClip);
-	extentX1 = pextent->x1;
-	extentY1 = pextent->y1;
-	extentX2 = pextent->x2;
-	extentY2 = pextent->y2;
 	while (n--) {
-		fullX1 = ppt->x;
-		fullY1 = ppt->y;
-		fullX2 = fullX1 + (int)*pwidth;
+		x1 = ppt->x;
+		y = ppt->y;
+		x2 = x1 + (int)*pwidth;
 		ppt++;
 		pwidth++;
 
-		if (fullY1 < extentY1 || extentY2 <= fullY1)
-			continue;
+		nbox = REGION_NUM_RECTS(pClip);
+		pbox = REGION_RECTS(pClip);
+		while (nbox--) {
+			if (pbox->y1 > y || pbox->y2 <= y)
+				continue;
 
-		if (fullX1 < extentX1)
-			fullX1 = extentX1;
+			if (x1 < pbox->x1)
+				x1 = pbox->x1;
 
-		if (fullX2 > extentX2)
-			fullX2 = extentX2;
+			if (x2 > pbox->x2)
+				x2 = pbox->x2;
 
-		if (fullX1 >= fullX2)
-			continue;
+			if (x2 <= x1)
+				continue;
 
-		nbox = REGION_NUM_RECTS(pClip);
-		if (nbox == 1) {
 			uxa_screen->info->composite(dst_pixmap,
-						    0, 0, 0, 0,
-						    fullX1 + off_x,
-						    fullY1 + off_y,
-						    fullX2 - fullX1, 1);
-		} else {
-			pbox = REGION_RECTS(pClip);
-			while (nbox--) {
-				if (pbox->y1 > fullY1)
-					break;
-
-				if (pbox->y1 <= fullY1) {
-					partX1 = pbox->x1;
-					if (partX1 < fullX1)
-						partX1 = fullX1;
-
-					partX2 = pbox->x2;
-					if (partX2 > fullX2)
-						partX2 = fullX2;
-
-					if (partX2 > partX1) {
-						uxa_screen->info->composite(dst_pixmap,
-									    0, 0, 0, 0,
-									    partX1 + off_x,
-									    fullY1 + off_y,
-									    partX2 - partX1, 1);
-					}
-				}
-				pbox++;
-			}
+						    0, 0,
+						    0, 0,
+						    x1 + off_x, y + off_y,
+						    x2 - x1, 1);
+
+			pbox++;
 		}
 	}
 
@@ -240,10 +211,8 @@ solid:
 				continue;
 
 			(*uxa_screen->info->solid) (dst_pixmap,
-						    x1 + off_x,
-						    y + off_y,
-						    x2 + off_x,
-						    y + 1 + off_y);
+						    x1 + off_x, y + off_y,
+						    x2 + off_x, y + 1 + off_y);
 			pbox++;
 		}
 	}
commit ace324e4aa27effdd621156eec03f3f87b610732
Author: Eric Anholt <eric at anholt.net>
Date:   Tue May 31 23:13:18 2011 -0700

    uxa: Simplify BLT solid acceleration for spans filling by only clipping once.
    
    We were clipping each span against the bounds of the clip, throwing
    out the span early if it was all clipped, and then walked the clip box
    clipping against each of the cliprects.  We would expect spans to
    typically be clipped against one box, and not thrown out, so we were
    not saving any work there.  For multiple cliprects, we were adding
    work.  Only for many spans clipped entirely out of a complicated clip
    region would it have saved work, and it clearly didn't save bugs as
    evidenced by the many fix attempts here.
    
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 0650ac2..31c37e8 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -1,3 +1,4 @@
+
 /*
  * Copyright ® 2001 Keith Packard
  *
@@ -65,7 +66,7 @@ uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n,
 	BoxPtr pextent, pbox;
 	int nbox;
 	int extentX1, extentX2, extentY1, extentY2;
-	int fullX1, fullX2, fullY1;
+	int x1, x2, y, fullX1, fullX2, fullY1;
 	int partX1, partX2;
 	int off_x, off_y;
 	xRenderColor color;
@@ -216,58 +217,34 @@ solid:
 						 pGC->fgPixel))
 		goto fallback;
 
-	pextent = REGION_EXTENTS(pGC->screen, pClip);
-	extentX1 = pextent->x1;
-	extentY1 = pextent->y1;
-	extentX2 = pextent->x2;
-	extentY2 = pextent->y2;
 	while (n--) {
-		fullX1 = ppt->x;
-		fullY1 = ppt->y;
-		fullX2 = fullX1 + (int)*pwidth;
+		x1 = ppt->x;
+		y = ppt->y;
+		x2 = x1 + (int)*pwidth;
 		ppt++;
 		pwidth++;
 
-		if (fullY1 < extentY1 || extentY2 <= fullY1)
-			continue;
+		nbox = REGION_NUM_RECTS(pClip);
+		pbox = REGION_RECTS(pClip);
+		while (nbox--) {
+			if (pbox->y1 > y || pbox->y2 <= y)
+				continue;
 
-		if (fullX1 < extentX1)
-			fullX1 = extentX1;
+			if (x1 < pbox->x1)
+				x1 = pbox->x1;
 
-		if (fullX2 > extentX2)
-			fullX2 = extentX2;
+			if (x2 > pbox->x2)
+				x2 = pbox->x2;
 
-		if (fullX1 >= fullX2)
-			continue;
+			if (x2 <= x1)
+				continue;
 
-		nbox = REGION_NUM_RECTS(pClip);
-		if (nbox == 1) {
 			(*uxa_screen->info->solid) (dst_pixmap,
-						    fullX1 + off_x,
-						    fullY1 + off_y,
-						    fullX2 + off_x,
-						    fullY1 + 1 + off_y);
-		} else {
-			pbox = REGION_RECTS(pClip);
-			while (nbox--) {
-				if (pbox->y1 <= fullY1 && fullY1 < pbox->y2) {
-					partX1 = pbox->x1;
-					if (partX1 < fullX1)
-						partX1 = fullX1;
-					partX2 = pbox->x2;
-					if (partX2 > fullX2)
-						partX2 = fullX2;
-					if (partX2 > partX1) {
-						(*uxa_screen->info->
-						 solid) (dst_pixmap,
-							 partX1 + off_x,
-							 fullY1 + off_y,
-							 partX2 + off_x,
-							 fullY1 + 1 + off_y);
-					}
-				}
-				pbox++;
-			}
+						    x1 + off_x,
+						    y + off_y,
+						    x2 + off_x,
+						    y + 1 + off_y);
+			pbox++;
 		}
 	}
 	(*uxa_screen->info->done_solid) (dst_pixmap);


More information about the xorg-commit mailing list