xf86-video-intel: 6 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Aug 26 06:58:55 PDT 2012


 src/sna/gen2_render.c |    4 +++-
 src/sna/gen3_render.c |    4 +++-
 src/sna/gen4_render.c |   13 +++++++++----
 src/sna/gen5_render.c |   13 +++++++++----
 src/sna/gen6_render.c |   24 ++++++++++--------------
 src/sna/gen7_render.c |   25 ++++++++++---------------
 src/sna/kgem.c        |    6 +++++-
 src/sna/kgem.h        |    4 +++-
 src/sna/sna_blt.c     |    4 +++-
 9 files changed, 55 insertions(+), 42 deletions(-)

New commits:
commit 8e10a5b348a37feadcf935ec7694e46cc0802bdf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 14:53:12 2012 +0100

    sna/gen6+: Do not call sna_blt_composite() after prepping the composite op
    
    As sna_blt_composite() will overwrite parts of the composite op as it
    checks whether or not it can execute that operation, it will lead to a
    crash as the normal render path finds the op corrupt. (The BLT
    conversion functions cater for the cases where we may wish to switch
    pipelines after choosing src/dst bo.)
    
    Reported-by: rei4dan at gmail.com
    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 390da52..c364f72 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2685,15 +2685,6 @@ gen6_render_composite(struct sna *sna,
 	if (!gen6_composite_set_target(sna, tmp, dst))
 		return false;
 
-	if (mask == NULL && sna->kgem.mode == KGEM_BLT &&
-	    sna_blt_composite(sna, op,
-			      src, dst,
-			      src_x, src_y,
-			      dst_x, dst_y,
-			      width, height,
-			      tmp, false))
-		return true;
-
 	sna_render_reduce_damage(tmp, dst_x, dst_y, width, height);
 
 	if (too_large(tmp->dst.width, tmp->dst.height)) {
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index f14d777..b8897d3 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2788,16 +2788,6 @@ gen7_render_composite(struct sna *sna,
 	if (!gen7_composite_set_target(sna, tmp, dst))
 		return false;
 
-	if (mask == NULL &&
-	    sna->kgem.mode == KGEM_BLT &&
-	    sna_blt_composite(sna, op,
-			      src, dst,
-			      src_x, src_y,
-			      dst_x, dst_y,
-			      width, height,
-			      tmp, false))
-		return true;
-
 	sna_render_reduce_damage(tmp, dst_x, dst_y, width, height);
 
 	if (too_large(tmp->dst.width, tmp->dst.height)) {
commit cbbe7727e766a5ee8767673feb6c8cdec38a7051
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 14:43:47 2012 +0100

    sna/gen6+: Simplify prefer_blt_bo
    
    As we already check the tiling state, so all we need to then check is
    that the pitch is within the BLT constraint.
    
    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 9c99b2a..390da52 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2387,7 +2387,7 @@ static inline bool untiled_tlb_miss(struct kgem_bo *bo)
 
 static bool prefer_blt_bo(struct sna *sna, struct kgem_bo *bo)
 {
-	return untiled_tlb_miss(bo) && kgem_bo_can_blt(&sna->kgem, bo);
+	return untiled_tlb_miss(bo) && bo->pitch < MAXSHORT;
 }
 
 static bool
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index b1f17d7..f14d777 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2476,7 +2476,7 @@ static inline bool untiled_tlb_miss(struct kgem_bo *bo)
 
 static bool prefer_blt_bo(struct sna *sna, struct kgem_bo *bo)
 {
-	return untiled_tlb_miss(bo) && kgem_bo_can_blt(&sna->kgem, bo);
+	return untiled_tlb_miss(bo) && bo->pitch < MAXSHORT;
 }
 
 inline static bool prefer_blt_ring(struct sna *sna)
commit 0c15824a8143a288716d2eacf03252cc54eb9466
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 14:29:41 2012 +0100

    sna: Add some DBG to kgem_is_idle()
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 825caa7..568d120 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1763,9 +1763,13 @@ bool __kgem_is_idle(struct kgem *kgem)
 	assert(!list_is_empty(&kgem->requests));
 
 	rq = list_last_entry(&kgem->requests, struct kgem_request, list);
-	if (kgem_busy(kgem, rq->bo->handle))
+	if (kgem_busy(kgem, rq->bo->handle)) {
+		DBG(("%s: last requests handle=%d still busy\n",
+		     __FUNCTION__, rq->bo->handle));
 		return false;
+	}
 
+	DBG(("%s: gpu idle\n", __FUNCTION__));
 	kgem_retire__requests(kgem);
 	assert(list_is_empty(&kgem->requests));
 	return true;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index d085a2f..d8018b8 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -261,8 +261,10 @@ bool kgem_retire(struct kgem *kgem);
 bool __kgem_is_idle(struct kgem *kgem);
 static inline bool kgem_is_idle(struct kgem *kgem)
 {
-	if (list_is_empty(&kgem->requests))
+	if (list_is_empty(&kgem->requests)) {
+		DBG(("%s: no outstanding requests\n", __FUNCTION__));
 		return true;
+	}
 
 	return __kgem_is_idle(kgem);
 }
commit d432983421286d343f7c487c12c7244b711f5a66
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 13:43:35 2012 +0100

    sna: Add some DBG to BLT composite substitute to show if redirection is used
    
    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 656e979..c286918 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1915,7 +1915,9 @@ sna_blt_composite__convert(struct sna *sna,
 	return false;
 #endif
 
-	DBG(("%s\n", __FUNCTION__));
+	DBG(("%s src=%d, dst=%d (redirect? %d)\n", __FUNCTION__,
+	     tmp->src.bo->handle, tmp->dst.bo->handle,
+	     tmp->redirect.real_bo ? tmp->redirect.real_bo->handle : 0));
 
 	if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo) ||
 	    !kgem_bo_can_blt(&sna->kgem, tmp->src.bo)) {
commit 5a5212117e7a73ce3fffb87c60a505a849e38c36
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 13:38:23 2012 +0100

    sna: Cleanup composite redirection after substituting the BLT
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index d2f6fe7..401d84a 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1782,8 +1782,10 @@ gen2_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 		break;
 	}
 
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index ab94bdb..b13b9bf 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2880,8 +2880,10 @@ gen3_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 
 		gen3_composite_channel_convert(&tmp->src);
 		break;
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e732810..7668caa 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2315,8 +2315,10 @@ gen4_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 
 		gen4_composite_channel_convert(&tmp->src);
 		break;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 0a7bc51..b24d742 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2330,8 +2330,10 @@ gen5_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 
 		gen5_composite_channel_convert(&tmp->src);
 		break;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 56e48ed..9c99b2a 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2721,8 +2721,10 @@ gen6_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 
 		gen6_composite_channel_convert(&tmp->src);
 		break;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 41921d4..b1f17d7 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2825,8 +2825,10 @@ gen7_render_composite(struct sna *sna,
 					       src_x, src_y,
 					       width, height,
 					       dst_x, dst_y,
-					       tmp))
+					       tmp)) {
+			sna_render_composite_redirect_done(sna, tmp);
 			return true;
+		}
 
 		gen7_composite_channel_convert(&tmp->src);
 		break;
commit 335821d588460c253b2ba2c8616a7c46e5ad0150
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 26 13:29:04 2012 +0100

    sna/gen4+: Check for allocation failure for the clear solid bo
    
    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 632793f..e732810 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2306,7 +2306,8 @@ gen4_render_composite(struct sna *sna,
 		DBG(("%s: failed to prepare source\n", __FUNCTION__));
 		goto cleanup_dst;
 	case 0:
-		gen4_composite_solid_init(sna, &tmp->src, 0);
+		if (!gen4_composite_solid_init(sna, &tmp->src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		if (mask == NULL &&
@@ -2361,7 +2362,8 @@ gen4_render_composite(struct sna *sna,
 				DBG(("%s: failed to prepare mask\n", __FUNCTION__));
 				goto cleanup_src;
 			case 0:
-				gen4_composite_solid_init(sna, &tmp->mask, 0);
+				if (!gen4_composite_solid_init(sna, &tmp->mask, 0))
+					goto cleanup_src;
 				/* fall through to fixup */
 			case 1:
 				gen4_composite_channel_convert(&tmp->mask);
@@ -2660,7 +2662,8 @@ gen4_render_composite_spans(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen4_composite_solid_init(sna, &tmp->base.src, 0);
+		if (!gen4_composite_solid_init(sna, &tmp->base.src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		gen4_composite_channel_convert(&tmp->base.src);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index aaf7e49..0a7bc51 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2321,7 +2321,8 @@ gen5_render_composite(struct sna *sna,
 		DBG(("%s: failed to prepare source picture\n", __FUNCTION__));
 		goto cleanup_dst;
 	case 0:
-		gen5_composite_solid_init(sna, &tmp->src, 0);
+		if (!gen5_composite_solid_init(sna, &tmp->src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		if (mask == NULL &&
@@ -2375,7 +2376,8 @@ gen5_render_composite(struct sna *sna,
 				DBG(("%s: failed to prepare mask picture\n", __FUNCTION__));
 				goto cleanup_src;
 			case 0:
-				gen5_composite_solid_init(sna, &tmp->mask, 0);
+				if (!gen5_composite_solid_init(sna, &tmp->mask, 0))
+					goto cleanup_src;
 				/* fall through to fixup */
 			case 1:
 				gen5_composite_channel_convert(&tmp->mask);
@@ -2690,7 +2692,8 @@ gen5_render_composite_spans(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen5_composite_solid_init(sna, &tmp->base.src, 0);
+		if (!gen5_composite_solid_init(sna, &tmp->base.src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		gen5_composite_channel_convert(&tmp->base.src);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index bfbcfd8..56e48ed 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2710,7 +2710,8 @@ gen6_render_composite(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen6_composite_solid_init(sna, &tmp->src, 0);
+		if (!gen6_composite_solid_init(sna, &tmp->src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		/* Did we just switch rings to prepare the source? */
@@ -2765,7 +2766,8 @@ gen6_render_composite(struct sna *sna,
 			case -1:
 				goto cleanup_src;
 			case 0:
-				gen6_composite_solid_init(sna, &tmp->mask, 0);
+				if (!gen6_composite_solid_init(sna, &tmp->mask, 0))
+					goto cleanup_src;
 				/* fall through to fixup */
 			case 1:
 				gen6_composite_channel_convert(&tmp->mask);
@@ -3149,7 +3151,8 @@ gen6_render_composite_spans(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen6_composite_solid_init(sna, &tmp->base.src, 0);
+		if (!gen6_composite_solid_init(sna, &tmp->base.src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		gen6_composite_channel_convert(&tmp->base.src);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 08ba6a0..41921d4 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2814,7 +2814,8 @@ gen7_render_composite(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen7_composite_solid_init(sna, &tmp->src, 0);
+		if (!gen7_composite_solid_init(sna, &tmp->src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		/* Did we just switch rings to prepare the source? */
@@ -2869,7 +2870,8 @@ gen7_render_composite(struct sna *sna,
 			case -1:
 				goto cleanup_src;
 			case 0:
-				gen7_composite_solid_init(sna, &tmp->mask, 0);
+				if (!gen7_composite_solid_init(sna, &tmp->mask, 0))
+					goto cleanup_src;
 				/* fall through to fixup */
 			case 1:
 				gen7_composite_channel_convert(&tmp->mask);
@@ -3241,7 +3243,8 @@ gen7_render_composite_spans(struct sna *sna,
 	case -1:
 		goto cleanup_dst;
 	case 0:
-		gen7_composite_solid_init(sna, &tmp->base.src, 0);
+		if (!gen7_composite_solid_init(sna, &tmp->base.src, 0))
+			goto cleanup_dst;
 		/* fall through to fixup */
 	case 1:
 		gen7_composite_channel_convert(&tmp->base.src);


More information about the xorg-commit mailing list