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

Chris Wilson ickle at kemper.freedesktop.org
Tue Jul 17 12:52:38 PDT 2012


 src/sna/fb/fbblt.c  |   39 ++++++++++++++++++---------------------
 src/sna/fb/fbcopy.c |   41 +++++++++++++----------------------------
 src/sna/sna_accel.c |    9 +++++----
 3 files changed, 36 insertions(+), 53 deletions(-)

New commits:
commit 53ff19f45a3cc4863845c23e8d3c2c2b95e03fd9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 17 19:40:16 2012 +0100

    sna: Allow wedged CopyPlane to operate inplace on the destination
    
    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 4321c21..d4b9f37 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -6051,7 +6051,7 @@ fallback:
 	if (!sna_gc_move_to_cpu(gc, dst, &region))
 		goto out;
 	if (!sna_drawable_move_region_to_cpu(dst, &region,
-					     MOVE_READ | MOVE_WRITE))
+					     drawable_gc_flags(dst, gc, false)))
 		goto out_gc;
 
 	DBG(("%s: fbCopyPlane(%d, %d, %d, %d, %d,%d) %x\n",
commit d4fa4d5494db45b227c9ae7f7a90cd5dfd940027
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 17 19:29:32 2012 +0100

    sna: Allow inplace copies for wedged CopyArea
    
    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 7229f36..4321c21 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4584,7 +4584,8 @@ sna_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 		if (!sna_gc_move_to_cpu(gc, dst, &region))
 			goto out;
 
-		if (!sna_drawable_move_region_to_cpu(dst, &region, MOVE_READ | MOVE_WRITE))
+		if (!sna_drawable_move_region_to_cpu(dst, &region,
+						     drawable_gc_flags(dst, gc, false)))
 			goto out_gc;
 
 		RegionTranslate(&region,
commit 217eeadf81a8cbb43e495e1e937acdd95c703377
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 17 19:35:06 2012 +0100

    sna: Allow operation inplace to scanout whilst wedged
    
    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 ebf7a23..7229f36 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1048,7 +1048,7 @@ static inline bool pixmap_inplace(struct sna *sna,
 	if (FORCE_INPLACE)
 		return FORCE_INPLACE > 0;
 
-	if (wedged(sna))
+	if (wedged(sna) && !priv->pinned)
 		return false;
 
 	if (priv->mapped)
@@ -1455,7 +1455,7 @@ static inline bool region_inplace(struct sna *sna,
 	if (FORCE_INPLACE)
 		return FORCE_INPLACE > 0;
 
-	if (wedged(sna))
+	if (wedged(sna) && !priv->pinned)
 		return false;
 
 	if (priv->cpu) {
commit 40ff29480a0dbf458adf1a1b0d3275ad1361530e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 17 18:38:49 2012 +0100

    sna: Tweak fast blt path
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/fb/fbblt.c b/src/sna/fb/fbblt.c
index 247a331..fd55c85 100644
--- a/src/sna/fb/fbblt.c
+++ b/src/sna/fb/fbblt.c
@@ -276,6 +276,7 @@ fbBlt(FbBits *srcLine, FbStride srcStride, int srcX,
 	if (alu == GXcopy && pm == FB_ALLONES && ((srcX|dstX|width) & 7) == 0) {
 		CARD8 *s = (CARD8 *) srcLine;
 		CARD8 *d = (CARD8 *) dstLine;
+		void *(*func)(void *, const void *, size_t);
 		int i;
 
 		srcStride *= sizeof(FbBits);
@@ -287,28 +288,24 @@ fbBlt(FbBits *srcLine, FbStride srcStride, int srcX,
 		DBG(("%s fast blt\n", __FUNCTION__));
 
 		if ((srcLine < dstLine && srcLine + width > dstLine) ||
-		    (dstLine < srcLine && dstLine + width > srcLine)) {
-			if (!upsidedown)
-				for (i = 0; i < height; i++)
-					memmove(d + i * dstStride,
-						s + i * srcStride,
-						width);
-			else
-				for (i = height - 1; i >= 0; i--)
-					memmove(d + i * dstStride,
-						s + i * srcStride,
-						width);
+		    (dstLine < srcLine && dstLine + width > srcLine))
+			func = memmove;
+		else
+			func = memcpy;
+		if (!upsidedown) {
+			if (srcStride == dstStride && srcStride == width) {
+				width *= height;
+				height = 1;
+			}
+			for (i = 0; i < height; i++)
+				func(d + i * dstStride,
+				     s + i * srcStride,
+				     width);
 		} else {
-			if (!upsidedown)
-				for (i = 0; i < height; i++)
-					memcpy(d + i * dstStride,
-					       s + i * srcStride,
-					       width);
-			else
-				for (i = height - 1; i >= 0; i--)
-					memcpy(d + i * dstStride,
-					       s + i * srcStride,
-					       width);
+			for (i = height; i--; )
+				func(d + i * dstStride,
+				     s + i * srcStride,
+				     width);
 		}
 
 		return;
commit fce69c79c4840e7863d7c382da0d22be90a9f19a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 17 18:28:24 2012 +0100

    sna: prefer fbBlt over pixman_blt
    
    It is currently much better optimised through memcpy.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/fb/fbcopy.c b/src/sna/fb/fbcopy.c
index a2b1ded..a486a5b 100644
--- a/src/sna/fb/fbcopy.c
+++ b/src/sna/fb/fbcopy.c
@@ -35,42 +35,27 @@ fbCopyNtoN(DrawablePtr src_drawable, DrawablePtr dst_drawable, GCPtr gc,
 {
 	CARD8 alu = gc ? gc->alu : GXcopy;
 	FbBits pm = gc ? fb_gc(gc)->pm : FB_ALLONES;
-	FbBits *src;
-	FbStride srcStride;
-	int srcBpp;
+	FbBits *src, *dst;
+	FbStride srcStride, dstStride;
+	int dstBpp, srcBpp;
 	int srcXoff, srcYoff;
-	FbBits *dst;
-	FbStride dstStride;
-	int dstBpp;
 	int dstXoff, dstYoff;
 
 	fbGetDrawable(src_drawable, src, srcStride, srcBpp, srcXoff, srcYoff);
 	fbGetDrawable(dst_drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
 
-	while (nbox--) {
-		if (pm == FB_ALLONES && alu == GXcopy && !reverse && !upsidedown) {
-			if (!pixman_blt
-			    ((uint32_t *) src, (uint32_t *) dst, srcStride, dstStride,
-			     srcBpp, dstBpp, (box->x1 + dx + srcXoff),
-			     (box->y1 + dy + srcYoff), (box->x1 + dstXoff),
-			     (box->y1 + dstYoff), (box->x2 - box->x1),
-			     (box->y2 - box->y1)))
-				goto fallback;
-			else
-				goto next;
-		}
-fallback:
-		fbBlt(src + (box->y1 + dy + srcYoff) * srcStride,
-		      srcStride,
-		      (box->x1 + dx + srcXoff) * srcBpp,
-		      dst + (box->y1 + dstYoff) * dstStride,
-		      dstStride,
+	src += (dy + srcYoff) * srcStride;
+	srcXoff += dx;
+	dst += dstYoff * dstStride;
+	do {
+		fbBlt(src + box->y1 * srcStride, srcStride,
+		      (box->x1 + srcXoff) * srcBpp,
+		      dst + box->y1 * dstStride, dstStride,
 		      (box->x1 + dstXoff) * dstBpp,
 		      (box->x2 - box->x1) * dstBpp,
-		      (box->y2 - box->y1), alu, pm, dstBpp, reverse, upsidedown);
-next:
-		box++;
-	}
+		      (box->y2 - box->y1),
+		      alu, pm, dstBpp, reverse, upsidedown);
+	} while (box++, --nbox);
 }
 
 void


More information about the xorg-commit mailing list