xf86-video-intel: 3 commits - src/sna/gen8_render.c src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Apr 5 04:24:20 PDT 2014


 src/sna/gen8_render.c |   11 ++++++-----
 src/sna/sna_accel.c   |   34 +++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 20 deletions(-)

New commits:
commit 3310ee89c1f1a663de5f5b12b8125809a213996f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Apr 5 12:18:31 2014 +0100

    sna: Avoid discarding damage when applying WHOLE hint to pixmap migration
    
    Once again, we must be careful when promoting from a region to whole
    pixmap migration that we do not discard required damage.
    
    Fixes regression from
    commit 27ac9f574f65cbd535751c925e9b2e2d7c8a6b3a [2.99.911]
    Author: Chris Wilson <chris at chris-wilson.co.uk>
    Date:   Thu Feb 27 08:33:52 2014 +0000
    
        sna: Avoid promoting region-to-whole migration and discarding damage
    
    Reported-by: gedgon at gmail.com
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77063
    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 0116d54..71ba34d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2500,7 +2500,10 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 		flags |= MOVE_INPLACE_HINT;
 	}
 
-	if (flags & MOVE_WHOLE_HINT && priv->gpu_damage == NULL)
+	if ((flags & (MOVE_WHOLE_HINT | MOVE_READ)) == (MOVE_WHOLE_HINT | MOVE_READ))
+		return _sna_pixmap_move_to_cpu(pixmap, flags);
+
+	if (flags & MOVE_WHOLE_HINT && priv->gpu_damage == NULL && priv->cpu_damage == NULL)
 		return _sna_pixmap_move_to_cpu(pixmap, flags);
 
 	if (priv->gpu_damage == NULL &&
@@ -2527,22 +2530,18 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 		return _sna_pixmap_move_to_cpu(pixmap, flags);
 	}
 
-	if ((flags & MOVE_READ) == 0 &&
-	    priv->gpu_damage &&
-	    region_subsumes_damage(region, priv->gpu_damage)) {
-		DBG(("%s: region [(%d, %d), (%d, %d)] subsumes damage [(%d,%d), (%d, %d)]\n",
+	if (flags & MOVE_WHOLE_HINT) {
+		DBG(("%s: region (%d, %d), (%d, %d) marked with WHOLE hint, pixmap %dx%d\n",
 		       __FUNCTION__,
 		       region->extents.x1,
 		       region->extents.y1,
 		       region->extents.x2,
 		       region->extents.y2,
-		       priv->gpu_damage->extents.x1,
-		       priv->gpu_damage->extents.y1,
-		       priv->gpu_damage->extents.x2,
-		       priv->gpu_damage->extents.y2));
+		       pixmap->drawable.width,
+		       pixmap->drawable.height));
 		if (dx | dy)
 			RegionTranslate(region, -dx, -dy);
-		return _sna_pixmap_move_to_cpu(pixmap, flags);
+		return _sna_pixmap_move_to_cpu(pixmap, flags | MOVE_READ);
 	}
 
 	if (priv->move_to_gpu && !priv->move_to_gpu(sna, priv, MOVE_READ)) {
@@ -4471,17 +4470,19 @@ try_upload_tiled_x(PixmapPtr pixmap, RegionRec *region,
 	if (wedged(sna))
 		return false;
 
-	DBG(("%s: bo? %d, can map? %d\n", __FUNCTION__,
-	     priv->gpu_bo != NULL,
-	     priv->gpu_bo ? kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, true) : 0));
-
 	replaces = region->data == NULL &&
 		w >= pixmap->drawable.width &&
 		h >= pixmap->drawable.height;
 
+	DBG(("%s: bo? %d, can map? %d, replaces? %d\n", __FUNCTION__,
+	     priv->gpu_bo != NULL,
+	     priv->gpu_bo ? kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, true) : 0,
+	     replaces));
+
 	if (priv->gpu_bo && (replaces || priv->gpu_bo->proxy)) {
 		DBG(("%s: discarding cached upload proxy\n", __FUNCTION__));
 		sna_pixmap_free_gpu(sna, priv);
+		replaces = true; /* Mark it all GPU damaged afterwards */
 	}
 	assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
 
@@ -4616,8 +4617,11 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		return true;
 
 	hint = MOVE_WRITE;
-	if (w == pixmap->drawable.width && h*stride > 4096)
+	if (w == pixmap->drawable.width && (h+1)*stride > 65536) {
+		DBG(("%s: large upload (%d bytes), marking WHOLE_HINT\n",
+		     __FUNCTION__, h*stride));
 		hint |= MOVE_WHOLE_HINT;
+	}
 
 	if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, region, hint))
 		return false;
commit 7e9ff48ddbe61ad2edbaefde7b94c84637a85291
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Apr 5 10:44:48 2014 +0100

    sna/gen8: Shrink 3DSTATE_SAMPLE_PATTERN packet
    
    This is now smaller than originally specified.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index bed28ca..e680f74 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -774,11 +774,7 @@ gen8_emit_invariant(struct sna *sna)
 	OUT_BATCH(1);
 
 #if SIM
-	OUT_BATCH(GEN8_3DSTATE_SAMPLE_PATTERN | (9 - 2));
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-	OUT_BATCH(0);
-	OUT_BATCH(0);
+	OUT_BATCH(GEN8_3DSTATE_SAMPLE_PATTERN | (5 - 2));
 	OUT_BATCH(0);
 	OUT_BATCH(0);
 	OUT_BATCH(0);
commit 878ed2d6250701e9ccceacb102b5542986976437
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Apr 5 10:43:25 2014 +0100

    sna/gen8: w/a for NULL depth buffer
    
    Instead of using a NULL type depth buffer, it is strongly suggested to
    use a 1x1 16-bit depth buffer instead (with address 0).
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index 1fb9909..bed28ca 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -640,8 +640,13 @@ static void
 gen8_emit_null_depth_buffer(struct sna *sna)
 {
 	OUT_BATCH(GEN8_3DSTATE_DEPTH_BUFFER | (8 - 2));
+#if 0
 	OUT_BATCH(SURFACE_NULL << DEPTH_BUFFER_TYPE_SHIFT |
 		  DEPTHFORMAT_D32_FLOAT << DEPTH_BUFFER_FORMAT_SHIFT);
+#else
+	OUT_BATCH(SURFACE_2D << DEPTH_BUFFER_TYPE_SHIFT |
+		  DEPTHFORMAT_D16_UNORM << DEPTH_BUFFER_FORMAT_SHIFT);
+#endif
 	OUT_BATCH64(0);
 	OUT_BATCH(0);
 	OUT_BATCH(0);


More information about the xorg-commit mailing list