xf86-video-intel: 3 commits - src/sna/gen6_common.h src/sna/gen6_render.c src/sna/gen7_render.c src/sna/gen8_render.c src/sna/kgem.c src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Apr 23 00:24:37 PDT 2015


 src/sna/gen6_common.h |   11 +++++++----
 src/sna/gen6_render.c |    2 +-
 src/sna/gen7_render.c |    2 +-
 src/sna/gen8_render.c |    2 +-
 src/sna/kgem.c        |   44 +++++++++++++++++---------------------------
 src/sna/sna_blt.c     |    3 +++
 6 files changed, 30 insertions(+), 34 deletions(-)

New commits:
commit 64e45993cf9d13b5900dc6b8afacffdfea14fa7f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 22 20:15:38 2015 +0100

    sna: Fix interpretation of SWCTRL
    
    Bspec says it is an override for the source format, irrespective of
    the tiling bit supplied in the command packet. So we need to apply the
    FLUSH+LRI more often.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 76e6913..d190255 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2209,7 +2209,9 @@ static void kgem_clear_swctrl(struct kgem *kgem)
 
 	*b++ = MI_LOAD_REGISTER_IMM;
 	*b++ = BCS_SWCTRL;
-	*b++ = kgem->bcs_state << 16;
+	*b++ = (BCS_SRC_Y | BCS_DST_Y) << 16;
+
+	kgem->bcs_state = 0;
 }
 
 static uint32_t kgem_end_batch(struct kgem *kgem)
@@ -3557,7 +3559,6 @@ void kgem_reset(struct kgem *kgem)
 	kgem->needs_reservation = false;
 	kgem->flush = 0;
 	kgem->batch_flags = kgem->batch_flags_base;
-	kgem->bcs_state = 0;
 	assert(kgem->batch);
 
 	kgem->next_request = __kgem_request_alloc(kgem);
@@ -6196,60 +6197,49 @@ void __kgem_bcs_set_tiling(struct kgem *kgem,
 			   struct kgem_bo *src,
 			   struct kgem_bo *dst)
 {
-	uint32_t state, mask, *b;
+	uint32_t state, *b;
 
 	DBG(("%s: src handle=%d:tiling=%d, dst handle=%d:tiling=%d\n",
 	     __FUNCTION__,
 	     src ? src->handle : 0, src ? src->tiling : 0,
 	     dst ? dst->handle : 0, dst ? dst->tiling : 0));
 	assert(kgem->mode == KGEM_BLT);
+	assert(dst == NULL || kgem_bo_can_blt(kgem, dst));
+	assert(src == NULL || kgem_bo_can_blt(kgem, src));
 
-	mask = state = 0;
-	if (dst && dst->tiling) {
-		assert(kgem_bo_can_blt(kgem, dst));
-		mask |= BCS_DST_Y;
-		if (dst->tiling == I915_TILING_Y)
-			state |= BCS_DST_Y;
-	}
+	state = 0;
+	if (dst && dst->tiling == I915_TILING_Y)
+		state |= BCS_DST_Y;
+	if (src && src->tiling == I915_TILING_Y)
+		state |= BCS_SRC_Y;
 
-	if (src && src->tiling) {
-		assert(kgem_bo_can_blt(kgem, src));
-		mask |= BCS_SRC_Y;
-		if (src->tiling == I915_TILING_Y)
-			state |= BCS_SRC_Y;
-	}
-
-	if ((kgem->bcs_state & mask) == state)
+	if (kgem->bcs_state == state)
 		return;
 
 	DBG(("%s: updating SWCTRL %x -> %x\n", __FUNCTION__,
-	     kgem->bcs_state, (kgem->bcs_state & ~mask) | state));
+	     kgem->bcs_state, state));
 
 	/* Over-estimate space in case we need to re-emit the cmd packet */
 	if (!kgem_check_batch(kgem, 24)) {
 		_kgem_submit(kgem);
 		_kgem_set_mode(kgem, KGEM_BLT);
+		if (state == 0)
+			return;
 	}
 
 	b = kgem->batch + kgem->nbatch;
 	if (kgem->nbatch) {
-		DBG(("%s: emitting flush before SWCTRL LRI\n",
-		     __FUNCTION__));
 		*b++ = MI_FLUSH_DW;
 		*b++ = 0;
 		*b++ = 0;
 		*b++ = 0;
 	}
-
-	DBG(("%s: emitting SWCTRL LRI to %x\n",
-	     __FUNCTION__, mask << 16 | state));
 	*b++ = MI_LOAD_REGISTER_IMM;
 	*b++ = BCS_SWCTRL;
-	*b++ = mask << 16 | state;
+	*b++ = (BCS_SRC_Y | BCS_DST_Y) << 16 | state;
 	kgem->nbatch = b - kgem->batch;
 
-	kgem->bcs_state &= ~mask;
-	kgem->bcs_state |= state;
+	kgem->bcs_state = state;
 }
 
 uint32_t kgem_add_reloc(struct kgem *kgem,
commit 52bc0b119cab977b82cbbd96f689b7376b83d6f2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 22 19:45:16 2015 +0100

    sna/gen6: Do not force a blt switch onto a Y-tiled surface
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_common.h b/src/sna/gen6_common.h
index 4bf69b1..898cda8 100644
--- a/src/sna/gen6_common.h
+++ b/src/sna/gen6_common.h
@@ -110,7 +110,7 @@ static int prefer_blt_bo(struct sna *sna,
 	return dst->tiling == I915_TILING_NONE || is_uncached(sna, dst);
 }
 
-inline static bool force_blt_ring(struct sna *sna)
+inline static bool force_blt_ring(struct sna *sna, struct kgem_bo *bo)
 {
 	if (sna->kgem.mode == KGEM_RENDER)
 		return false;
@@ -118,6 +118,9 @@ inline static bool force_blt_ring(struct sna *sna)
 	if (NO_RING_SWITCH(sna))
 		return sna->kgem.ring == KGEM_BLT;
 
+	if (bo->tiling == I915_TILING_Y)
+		return false;
+
 	if (sna->flags & SNA_POWERSAVE)
 		return true;
 
@@ -133,7 +136,7 @@ prefer_blt_ring(struct sna *sna, struct kgem_bo *bo, unsigned flags)
 	if (PREFER_RENDER)
 		return PREFER_RENDER < 0;
 
-	assert(!force_blt_ring(sna));
+	assert(!force_blt_ring(sna, bo));
 	assert(!kgem_bo_is_render(bo) || NO_RING_SWITCH(sna));
 
 	if (kgem_bo_is_blt(bo))
@@ -173,7 +176,7 @@ prefer_blt_composite(struct sna *sna, struct sna_composite_op *tmp)
 	    untiled_tlb_miss(tmp->src.bo))
 		return true;
 
-	if (force_blt_ring(sna))
+	if (force_blt_ring(sna, tmp->dst.bo))
 		return true;
 
 	if (prefer_render_ring(sna, tmp->dst.bo))
@@ -194,7 +197,7 @@ prefer_blt_fill(struct sna *sna, struct kgem_bo *bo, unsigned flags)
 	if (untiled_tlb_miss(bo))
 		return true;
 
-	if (force_blt_ring(sna))
+	if (force_blt_ring(sna, bo))
 		return true;
 
 	if ((flags & (FILL_POINTS | FILL_SPANS)) == 0) {
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 312d6af..ca1f9c5 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2718,7 +2718,7 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
-	if (force_blt_ring(sna))
+	if (force_blt_ring(sna, dst_bo))
 		return true;
 
 	if (kgem_bo_is_render(dst_bo) ||
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index d1de752..6c0e7f4 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2916,7 +2916,7 @@ prefer_blt_copy(struct sna *sna,
 	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
 		return false;
 
-	if (force_blt_ring(sna))
+	if (force_blt_ring(sna, dst_bo))
 		return true;
 
 	if ((flags & COPY_SMALL ||
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index b40c582..660fc5a 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -2766,7 +2766,7 @@ prefer_blt_copy(struct sna *sna,
 	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
 		return false;
 
-	if (force_blt_ring(sna))
+	if (force_blt_ring(sna, dst_bo))
 		return true;
 
 	if ((flags & COPY_SMALL ||
commit 45475fb7c9d84579c836b5893571c5185d568198
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 22 19:17:19 2015 +0100

    sna: Update blt fallback to handle Y-tiled surfaces
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 1b82abc..843466d 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -4190,6 +4190,7 @@ bool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu,
 		DBG(("%s: dst == src\n", __FUNCTION__));
 
 		if (src_bo->tiling == I915_TILING_Y &&
+		    !sna->kgem.can_blt_y &&
 		    kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
 			struct kgem_bo *bo;
 
@@ -4237,6 +4238,7 @@ bool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu,
 		}
 	} else {
 		if (src_bo->tiling == I915_TILING_Y &&
+		    !sna->kgem.can_blt_y &&
 		    kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
 			DBG(("%s: src is y-tiled\n", __FUNCTION__));
 			if (src->type != DRAWABLE_PIXMAP)
@@ -4251,6 +4253,7 @@ bool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu,
 		}
 
 		if (dst_bo->tiling == I915_TILING_Y &&
+		    !sna->kgem.can_blt_y &&
 		    kgem_bo_blt_pitch_is_ok(&sna->kgem, dst_bo)) {
 			DBG(("%s: dst is y-tiled\n", __FUNCTION__));
 			if (dst->type != DRAWABLE_PIXMAP)


More information about the xorg-commit mailing list