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

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 24 10:23:53 UTC 2019


 src/sna/gen4_render.c |    3 +++
 src/sna/gen6_common.h |   44 ++++++++++++++++++++++++--------------------
 src/sna/gen6_render.c |    2 +-
 src/sna/gen7_render.c |    2 +-
 src/sna/gen8_render.c |   43 ++++++++++++++++++++++++++-----------------
 src/sna/gen9_render.c |   12 ++----------
 src/sna/kgem.h        |    7 +++++--
 src/sna/sna_dri2.c    |    9 +++++----
 8 files changed, 67 insertions(+), 55 deletions(-)

New commits:
commit 364c91697805e3d6504c14128ec21d95026a2551
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 23 18:29:26 2019 +0100

    sna/dri2: Skip stale client swap before asserting
    
    Check for a stale backbuffer (the client didn't call DRI2GetBuffers
    between DRI2SwapBuffers) before asserting so that we should be
    more resilient with asserts enabled for client errors.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=111197
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 9cddb57f..4acb04c2 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -3284,7 +3284,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	CARD64 current_msc;
 	bool immediate;
 
-	DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d, active=%d) , front=%u (refs=%d/%d, flush=%d, active=%d)\n",
+	DBG(("%s: draw=%lu %dx%d, pixmap=%ld %dx%d, back=%u (refs=%d/%d, flush=%d, active=%d, stale=%d) , front=%u (refs=%d/%d, flush=%d, active=%d)\n",
 	     __FUNCTION__,
 	     (long)draw->id, draw->width, draw->height,
 	     get_drawable_pixmap(draw)->drawable.serialNumber,
@@ -3295,6 +3295,7 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	     get_private(back)->bo->refcnt,
 	     get_private(back)->bo->flush,
 	     get_private(back)->bo->active_scanout,
+	     get_private(back)->stale,
 	     get_private(front)->bo->handle,
 	     get_private(front)->refcnt,
 	     get_private(front)->bo->refcnt,
@@ -3317,9 +3318,6 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 	assert(get_private(front)->bo->refcnt);
 	assert(get_private(back)->bo->refcnt);
 
-	assert(get_private(front)->bo->active_scanout);
-	assert(!get_private(back)->bo->active_scanout);
-
 	if (get_private(front)->pixmap != get_drawable_pixmap(draw)) {
 		DBG(("%s: decoupled DRI2 front pixmap=%ld, actual pixmap=%ld\n",
 		     __FUNCTION__,
@@ -3333,6 +3331,9 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
 		goto skip;
 	}
 
+	assert(get_private(front)->bo->active_scanout);
+	assert(!get_private(back)->bo->active_scanout);
+
 	if (draw->type != DRAWABLE_PIXMAP) {
 		WindowPtr win = (WindowPtr)draw;
 		struct dri2_window *priv = dri2_window(win);
commit 95ea05645a3abe7fa69922fe40e0839940706f9d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jul 18 23:32:38 2019 +0100

    sna: Rebalance prefer_blt to weight I915_TILING_Y higher
    
    Mixing I915_TILING_Y and the blitter is painfully slow, so we need to
    take use of I915_TILING_Y into more prominent consideration and even
    force a ring switch in case it is being used.
    
    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 b53ec0c9..2dd20a88 100644
--- a/src/sna/gen6_common.h
+++ b/src/sna/gen6_common.h
@@ -43,15 +43,15 @@ inline static bool can_switch_to_blt(struct sna *sna,
 				     struct kgem_bo *bo,
 				     unsigned flags)
 {
-	if (sna->kgem.ring != KGEM_RENDER)
+	if (bo && bo->tiling == I915_TILING_Y)
+		return false;
+
+	if (PREFER_RENDER < 0 && sna->kgem.ring != KGEM_RENDER)
 		return true;
 
 	if (bo && RQ_IS_BLT(bo->rq))
 		return true;
 
-	if (bo && bo->tiling == I915_TILING_Y)
-		return false;
-
 	if (bo && !kgem_bo_can_blt(&sna->kgem, bo))
 		return false;
 
@@ -87,41 +87,45 @@ static int prefer_blt_bo(struct sna *sna,
 	if (PREFER_RENDER)
 		return PREFER_RENDER < 0;
 
-	if (dst->rq)
-		return RQ_IS_BLT(dst->rq);
-
-	if (sna->flags & SNA_POWERSAVE)
-		return true;
+	if (dst->tiling == I915_TILING_Y)
+		return false;
 
 	if (src) {
 		if (sna->render_state.gt > 1)
 			return false;
 
-		if (src->rq)
-			return RQ_IS_BLT(src->rq);
-
 		if (src->tiling == I915_TILING_Y)
 			return false;
+
+		if (src->rq)
+			return RQ_IS_BLT(src->rq);
         } else {
                 if (sna->render_state.gt > 2)
                         return false;
         }
 
+	if (dst->rq)
+		return RQ_IS_BLT(dst->rq);
+
+	if (sna->flags & SNA_POWERSAVE)
+		return true;
+
 	if (sna->render_state.gt < 2)
 		return true;
 
 	return dst->tiling == I915_TILING_NONE || is_uncached(sna, dst);
 }
 
-inline static bool force_blt_ring(struct sna *sna, struct kgem_bo *bo)
+inline static bool
+force_blt_ring(struct sna *sna, struct kgem_bo *dst, struct kgem_bo *src)
 {
-	if (sna->kgem.mode == KGEM_RENDER)
+	if (sna->kgem.ring != KGEM_BLT)
 		return false;
 
 	if (NO_RING_SWITCH(sna))
-		return sna->kgem.ring == KGEM_BLT;
+		return sna->kgem.mode == KGEM_BLT;
 
-	if (bo->tiling == I915_TILING_Y)
+	if (kgem_bo_is_render(dst) || (src && kgem_bo_is_render(src)))
 		return false;
 
 	if (sna->flags & SNA_POWERSAVE)
@@ -139,10 +143,10 @@ prefer_blt_ring(struct sna *sna, struct kgem_bo *bo, unsigned flags)
 	if (PREFER_RENDER)
 		return PREFER_RENDER < 0;
 
-	assert(!force_blt_ring(sna, bo));
+	assert(!force_blt_ring(sna, bo, NULL));
 	assert(!kgem_bo_is_render(bo) || NO_RING_SWITCH(sna));
 
-	if (kgem_bo_is_blt(bo))
+	if (!sna->kgem.has_semaphores && kgem_bo_is_blt(bo))
 		return true;
 
 	return can_switch_to_blt(sna, bo, flags);
@@ -179,7 +183,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, tmp->dst.bo))
+	if (force_blt_ring(sna, tmp->dst.bo, tmp->src.bo))
 		return true;
 
 	if (prefer_render_ring(sna, tmp->dst.bo))
@@ -200,7 +204,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, bo))
+	if (force_blt_ring(sna, bo, NULL))
 		return true;
 
 	if ((flags & (FILL_POINTS | FILL_SPANS)) == 0) {
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0a53ef56..9eefcbda 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2761,7 +2761,7 @@ static inline bool prefer_blt_copy(struct sna *sna,
 	    untiled_tlb_miss(dst_bo))
 		return true;
 
-	if (force_blt_ring(sna, dst_bo))
+	if (force_blt_ring(sna, dst_bo, src_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 0a3bda76..a33ba902 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2969,7 +2969,7 @@ prefer_blt_copy(struct sna *sna,
 	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
 		return false;
 
-	if (force_blt_ring(sna, dst_bo))
+	if (force_blt_ring(sna, dst_bo, src_bo))
 		return true;
 
 	if ((flags & COPY_SMALL ||
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 69617da5..5d09c2cc 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -2084,11 +2084,6 @@ try_blt(struct sna *sna,
 {
 	struct kgem_bo *bo;
 
-	if (sna->kgem.mode == KGEM_BLT) {
-		DBG(("%s: already performing BLT\n", __FUNCTION__));
-		goto execute;
-	}
-
 	if (too_large(width, height)) {
 		DBG(("%s: operation too large for 3D pipe (%d, %d)\n",
 		     __FUNCTION__, width, height));
@@ -2129,7 +2124,7 @@ try_blt(struct sna *sna,
 			goto execute;
 	}
 
-	if (sna->kgem.ring == KGEM_BLT) {
+	if (sna->kgem.mode == KGEM_BLT) {
 		DBG(("%s: already performing BLT\n", __FUNCTION__));
 		goto execute;
 	}
@@ -2796,40 +2791,53 @@ prefer_blt_copy(struct sna *sna,
 		struct kgem_bo *dst_bo,
 		unsigned flags)
 {
-	if (sna->kgem.mode == KGEM_BLT)
-		return true;
-
 	assert((flags & COPY_SYNC) == 0);
 
 	if (untiled_tlb_miss(src_bo) ||
-	    untiled_tlb_miss(dst_bo))
+	    untiled_tlb_miss(dst_bo)) {
+		DBG(("%s: TLB miss -> blt\n", __func__));
 		return true;
+	}
 
-	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
+	if (flags & COPY_DRI && !sna->kgem.has_semaphores) {
+		DBG(("%s: DRI -> render\n", __func__));
 		return false;
+	}
 
-	if (force_blt_ring(sna, dst_bo))
+	if (force_blt_ring(sna, dst_bo, src_bo)) {
+		DBG(("%s: force BLT -> blt\n", __func__));
 		return true;
+	}
 
 	if ((flags & COPY_SMALL ||
 	     (sna->render_state.gt < 3 && src_bo == dst_bo)) &&
-	    can_switch_to_blt(sna, dst_bo, flags))
+	    can_switch_to_blt(sna, dst_bo, flags)) {
+		DBG(("%s: small/self copy -> blt\n", __func__));
 		return true;
+	}
 
 	if (kgem_bo_is_render(dst_bo) ||
-	    kgem_bo_is_render(src_bo))
+	    kgem_bo_is_render(src_bo)) {
+		DBG(("%s: render bo -> render\n", __func__));
 		return false;
+	}
 
 	if (flags & COPY_LAST &&
 	    sna->render_state.gt < 3 &&
-            can_switch_to_blt(sna, dst_bo, flags))
+            can_switch_to_blt(sna, dst_bo, flags)) {
+		DBG(("%s: copy last -> blt\n", __func__));
 		return true;
+	}
 
-	if (prefer_render_ring(sna, dst_bo))
+	if (prefer_render_ring(sna, dst_bo)) {
+		DBG(("%s: prefer render -> render\n", __func__));
 		return false;
+	}
 
-	if (!prefer_blt_ring(sna, dst_bo, flags))
+	if (!prefer_blt_ring(sna, dst_bo, flags)) {
+		DBG(("%s: !prefer blt -> render\n", __func__));
 		return false;
+	}
 
 	return prefer_blt_bo(sna, src_bo, dst_bo);
 }
@@ -3116,6 +3124,7 @@ gen8_render_copy(struct sna *sna, uint8_t alu,
 	    unaligned(src_bo, src->drawable.bitsPerPixel) ||
 	    unaligned(dst_bo, dst->drawable.bitsPerPixel)) {
 fallback:
+		DBG(("%s: blt fallback\n", __func__));
 		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return false;
 
diff --git a/src/sna/gen9_render.c b/src/sna/gen9_render.c
index 3ed2eb3b..46908499 100644
--- a/src/sna/gen9_render.c
+++ b/src/sna/gen9_render.c
@@ -2162,11 +2162,6 @@ try_blt(struct sna *sna,
 {
 	struct kgem_bo *bo;
 
-	if (sna->kgem.mode == KGEM_BLT) {
-		DBG(("%s: already performing BLT\n", __FUNCTION__));
-		goto execute;
-	}
-
 	if (too_large(width, height)) {
 		DBG(("%s: operation too large for 3D pipe (%d, %d)\n",
 		     __FUNCTION__, width, height));
@@ -2207,7 +2202,7 @@ try_blt(struct sna *sna,
 			goto execute;
 	}
 
-	if (sna->kgem.ring == KGEM_BLT) {
+	if (sna->kgem.mode == KGEM_BLT) {
 		DBG(("%s: already performing BLT\n", __FUNCTION__));
 		goto execute;
 	}
@@ -2875,9 +2870,6 @@ prefer_blt_copy(struct sna *sna,
 		struct kgem_bo *dst_bo,
 		unsigned flags)
 {
-	if (sna->kgem.mode == KGEM_BLT)
-		return true;
-
 	assert((flags & COPY_SYNC) == 0);
 
 	if (untiled_tlb_miss(src_bo) ||
@@ -2887,7 +2879,7 @@ prefer_blt_copy(struct sna *sna,
 	if (flags & COPY_DRI && !sna->kgem.has_semaphores)
 		return false;
 
-	if (force_blt_ring(sna, dst_bo))
+	if (force_blt_ring(sna, dst_bo, src_bo))
 		return true;
 
 	if ((flags & COPY_SMALL ||
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 8101ce51..b7871590 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -686,9 +686,12 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo)
 
 static inline bool kgem_bo_is_render(struct kgem_bo *bo)
 {
-	DBG(("%s: handle=%d, rq? %d [%d]\n", __FUNCTION__,
-	     bo->handle, bo->rq != NULL, (int)RQ_RING(bo->rq)));
+	DBG(("%s: handle=%d, tiling=%d, rq? %d [%d]\n", __FUNCTION__,
+	     bo->handle, bo->tiling, bo->rq != NULL, (int)RQ_RING(bo->rq)));
 	assert(bo->refcnt);
+	if (bo->tiling >= I915_TILING_Y)
+		return true;
+
 	return bo->rq && RQ_RING(bo->rq) != KGEM_BLT;
 }
 
commit bd585f626cd7b9e614cfb00dba24ab686b94b1f0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 9 01:10:14 2019 +0000

    sna/gen4: Deactivate CONSTANT_BUFFER
    
    Turn off the CONSTANT_BUFFER loads as we do not use them.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index b6a496ca..ae26debf 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -883,6 +883,9 @@ gen4_emit_invariant(struct sna *sna)
 	else
 		OUT_BATCH(GEN4_PIPELINE_SELECT | PIPELINE_SELECT_3D);
 
+	OUT_BATCH(GEN4_CONSTANT_BUFFER);
+	OUT_BATCH(0);
+
 	gen4_emit_state_base_address(sna);
 
 	sna->render_state.gen4.needs_invariant = false;


More information about the xorg-commit mailing list