xf86-video-intel: 4 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_display.c src/sna/sna_dri2.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Thu Apr 2 00:34:20 PDT 2015


 src/sna/gen6_render.c |    3 ++
 src/sna/gen7_render.c |    4 +++
 src/sna/gen8_render.c |    4 +++
 src/sna/kgem.c        |    4 ++-
 src/sna/sna_accel.c   |   42 ++++++++-----------------------
 src/sna/sna_blt.c     |   66 ++++++--------------------------------------------
 src/sna/sna_display.c |    2 -
 src/sna/sna_dri2.c    |    4 +--
 src/sna/sna_render.h  |    1 
 9 files changed, 37 insertions(+), 93 deletions(-)

New commits:
commit e47eb0c5e588a6cfc4e6f12824814f11e802ed51
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 1 23:00:57 2015 +0100

    sna: Don't unroll BLT points
    
    The compiler is smarter than I am; unrolling hurts here.
    
    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 6fa15b2..a11a77d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4593,7 +4593,7 @@ static inline bool box32_trim_and_translate(Box32Rec *box, DrawablePtr d, GCPtr
 	return box32_clip(box, gc);
 }
 
-static inline void box_add_pt(BoxPtr box, int16_t x, int16_t y)
+static inline void box_add_xy(BoxPtr box, int16_t x, int16_t y)
 {
 	if (box->x1 > x)
 		box->x1 = x;
@@ -4606,6 +4606,11 @@ static inline void box_add_pt(BoxPtr box, int16_t x, int16_t y)
 		box->y2 = y;
 }
 
+static inline void box_add_pt(BoxPtr box, const DDXPointRec *pt)
+{
+	box_add_xy(box, pt->x, pt->y);
+}
+
 static inline bool box32_to_box16(const Box32Rec *b32, BoxRec *b16)
 {
 	b16->x1 = b32->x1;
@@ -8968,36 +8973,11 @@ sna_poly_point_extents(DrawablePtr drawable, GCPtr gc,
 			last.x += pt->x;
 			last.y += pt->y;
 			pt++;
-			box_add_pt(&box, last.x, last.y);
+			box_add_xy(&box, last.x, last.y);
 		}
 	} else {
-		--n; ++pt;
-		while (n >= 8) {
-			box_add_pt(&box, pt[0].x, pt[0].y);
-			box_add_pt(&box, pt[1].x, pt[1].y);
-			box_add_pt(&box, pt[2].x, pt[2].y);
-			box_add_pt(&box, pt[3].x, pt[3].y);
-			box_add_pt(&box, pt[4].x, pt[4].y);
-			box_add_pt(&box, pt[5].x, pt[5].y);
-			box_add_pt(&box, pt[6].x, pt[6].y);
-			box_add_pt(&box, pt[7].x, pt[7].y);
-			pt += 8;
-			n -= 8;
-		}
-		if (n & 4) {
-			box_add_pt(&box, pt[0].x, pt[0].y);
-			box_add_pt(&box, pt[1].x, pt[1].y);
-			box_add_pt(&box, pt[2].x, pt[2].y);
-			box_add_pt(&box, pt[3].x, pt[3].y);
-			pt += 4;
-		}
-		if (n & 2) {
-			box_add_pt(&box, pt[0].x, pt[0].y);
-			box_add_pt(&box, pt[1].x, pt[1].y);
-			pt += 2;
-		}
-		if (n & 1)
-			box_add_pt(&box, pt[0].x, pt[0].y);
+		while (--n)
+			box_add_pt(&box, ++pt);
 	}
 	box.x2++;
 	box.y2++;
@@ -9709,7 +9689,7 @@ sna_poly_line_extents(DrawablePtr drawable, GCPtr gc,
 			y += pt->y;
 			if (blt)
 				blt &= pt->x == 0 || pt->y == 0;
-			box_add_pt(&box, x, y);
+			box_add_xy(&box, x, y);
 		}
 	} else {
 		int x = box.x1;
@@ -9721,7 +9701,7 @@ sna_poly_line_extents(DrawablePtr drawable, GCPtr gc,
 				x = pt->x;
 				y = pt->y;
 			}
-			box_add_pt(&box, pt->x, pt->y);
+			box_add_pt(&box, pt);
 		}
 	}
 	box.x2++;
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 59b8141..b62d7fd 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -3185,65 +3185,15 @@ fastcall static void sna_blt_fill_op_points(struct sna *sna,
 		assert(kgem->nbatch < kgem->surface);
 
 		if ((dx|dy) == 0) {
-			while (n_this_time >= 8) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, 0, 0);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, 0, 0);
-				*((uint64_t *)b + 2) = pt_add(cmd, p+2, 0, 0);
-				*((uint64_t *)b + 3) = pt_add(cmd, p+3, 0, 0);
-				*((uint64_t *)b + 4) = pt_add(cmd, p+4, 0, 0);
-				*((uint64_t *)b + 5) = pt_add(cmd, p+5, 0, 0);
-				*((uint64_t *)b + 6) = pt_add(cmd, p+6, 0, 0);
-				*((uint64_t *)b + 7) = pt_add(cmd, p+7, 0, 0);
-				b += 16;
-				n_this_time -= 8;
-				p += 8;
-			}
-			if (n_this_time & 4) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, 0, 0);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, 0, 0);
-				*((uint64_t *)b + 2) = pt_add(cmd, p+2, 0, 0);
-				*((uint64_t *)b + 3) = pt_add(cmd, p+3, 0, 0);
-				b += 8;
-				p += 4;
-			}
-			if (n_this_time & 2) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, 0, 0);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, 0, 0);
-				b += 4;
-				p += 2;
-			}
-			if (n_this_time & 1)
-				*((uint64_t *)b + 0) = pt_add(cmd, p++, 0, 0);
+			do {
+				*(uint64_t *)b = pt_add(cmd, p++, 0, 0);
+				b += 2;
+			} while (--n_this_time);
 		} else {
-			while (n_this_time >= 8) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, dx, dy);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, dx, dy);
-				*((uint64_t *)b + 2) = pt_add(cmd, p+2, dx, dy);
-				*((uint64_t *)b + 3) = pt_add(cmd, p+3, dx, dy);
-				*((uint64_t *)b + 4) = pt_add(cmd, p+4, dx, dy);
-				*((uint64_t *)b + 5) = pt_add(cmd, p+5, dx, dy);
-				*((uint64_t *)b + 6) = pt_add(cmd, p+6, dx, dy);
-				*((uint64_t *)b + 7) = pt_add(cmd, p+7, dx, dy);
-				b += 16;
-				n_this_time -= 8;
-				p += 8;
-			}
-			if (n_this_time & 4) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, dx, dy);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, dx, dy);
-				*((uint64_t *)b + 2) = pt_add(cmd, p+2, dx, dy);
-				*((uint64_t *)b + 3) = pt_add(cmd, p+3, dx, dy);
-				b += 8;
-				p += 8;
-			}
-			if (n_this_time & 2) {
-				*((uint64_t *)b + 0) = pt_add(cmd, p+0, dx, dy);
-				*((uint64_t *)b + 1) = pt_add(cmd, p+1, dx, dy);
-				b += 4;
-				p += 2;
-			}
-			if (n_this_time & 1)
-				*((uint64_t *)b + 0) = pt_add(cmd, p++, dx, dy);
+			do {
+				*(uint64_t *)b = pt_add(cmd, p++, dx, dy);
+				b += 2;
+			} while (--n_this_time);
 		}
 
 		if (!n)
commit 7df58456b8d99a9953a871c656657cbc923dc238
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 1 22:59:20 2015 +0100

    sna: Add DBG option to disable manual detiling
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4565f24..79e2238 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -85,6 +85,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define DBG_NO_WT 0
 #define DBG_NO_WC_MMAP 0
 #define DBG_NO_SCANOUT_Y 0
+#define DBG_NO_DETILING 0
 #define DBG_DUMP 0
 #define DBG_NO_MALLOC_CACHE 0
 
@@ -1410,7 +1411,8 @@ static void kgem_init_swizzling(struct kgem *kgem)
 	if (kgem->gen < 50 && tiling.phys_swizzle_mode != tiling.swizzle_mode)
 		goto out;
 
-	choose_memcpy_tiled_x(kgem, tiling.swizzle_mode);
+	if (!DBG_NO_DETILING)
+		choose_memcpy_tiled_x(kgem, tiling.swizzle_mode);
 out:
 	gem_close(kgem->fd, tiling.handle);
 }
commit b56b63bf937bd3ecaf47cbfc7d0c15f16155fd01
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 1 18:13:50 2015 +0100

    sna: Relax a y-tiling fb assertion
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index f0cf481..51e5133 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -440,7 +440,7 @@ static unsigned get_fb(struct sna *sna, struct kgem_bo *bo,
 	DBG(("%s: create fb %dx%d@%d/%d\n",
 	     __FUNCTION__, width, height, scrn->depth, scrn->bitsPerPixel));
 
-	assert(bo->tiling != I915_TILING_Y);
+	assert(bo->tiling != I915_TILING_Y || sna->kgem.can_scanout_y);
 	assert((bo->pitch & 63) == 0);
 
 	VG_CLEAR(arg);
commit f00599f971cdde1c5006764f4b6ef08ad4a4eb17
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 1 17:45:31 2015 +0100

    sna/dri: Avoid using the BLT for DRI2CopyRegion if no semaphores
    
    We expect mesa nowadays to preferentially use the render pipeline for
    doing its clears and so want to avoid handing it back an active BLT bo
    if we don't have semaphores (as that would cause a sync).
    
    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 afebab4..7878e7b 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2684,6 +2684,9 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	if (sna->kgem.ring == KGEM_BLT)
 		return true;
 
+	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
+		return false;
+
 	if ((flags & COPY_SMALL || src_bo == dst_bo) &&
 	    can_switch_to_blt(sna, dst_bo, flags))
 		return true;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 8780786..39f0d38 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2890,6 +2890,9 @@ prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
+	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
+		return false;
+
 	if (force_blt_ring(sna))
 		return true;
 
@@ -2903,6 +2906,7 @@ prefer_blt_copy(struct sna *sna,
 		return false;
 
 	if (flags & COPY_LAST &&
+	    sna->render_state.gt < 3 &&
             can_switch_to_blt(sna, dst_bo, flags))
 		return true;
 
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 043e268..ebabb2e 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -2713,6 +2713,9 @@ prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
+	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
+		return false;
+
 	if (force_blt_ring(sna))
 		return true;
 
@@ -2726,6 +2729,7 @@ prefer_blt_copy(struct sna *sna,
 		return false;
 
 	if (flags & COPY_LAST &&
+	    sna->render_state.gt < 3 &&
             can_switch_to_blt(sna, dst_bo, flags))
 		return true;
 
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 83e652d..7868d03 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -246,7 +246,7 @@ sna_dri2_get_back(struct sna *sna,
 			if (sna->render.copy_boxes(sna, GXcopy,
 						   draw, get_private(back)->bo, 0, 0,
 						   draw, bo, 0, 0,
-						   &box, 1, 0))
+						   &box, 1, COPY_LAST | COPY_DRI))
 				flags = back->flags;
 		}
 	}
@@ -1155,7 +1155,7 @@ __sna_dri2_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
 	     boxes[0].x2, boxes[0].y2,
 	     n, sx, sy, dx, dy));
 
-	hint = COPY_LAST;
+	hint = COPY_LAST | COPY_DRI;
 	if (flags & DRI2_SYNC)
 		hint |= COPY_SYNC;
 	if (!sna->render.copy_boxes(sna, GXcopy,
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index dcc0ddd..f59a928 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -287,6 +287,7 @@ struct sna_render {
 #define COPY_SYNC 0x2
 #define COPY_NO_OVERLAP 0x4
 #define COPY_SMALL 0x8
+#define COPY_DRI 0x10
 
 	bool (*copy)(struct sna *sna, uint8_t alu,
 		     PixmapPtr src, struct kgem_bo *src_bo,


More information about the xorg-commit mailing list