xf86-video-intel: 9 commits - src/sna/gen3_render.c src/sna/sna_accel.c src/sna/sna_render_inline.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Aug 19 13:53:00 PDT 2012


 src/sna/gen3_render.c       |   13 +++++++++----
 src/sna/sna_accel.c         |   25 +++++++++++++++++++------
 src/sna/sna_render_inline.h |   20 ++++++++++++++------
 src/sna/sna_trapezoids.c    |   41 +++++++++++++++++++++++++++++++++--------
 4 files changed, 75 insertions(+), 24 deletions(-)

New commits:
commit c39fe0253847f5a86e16b47ba420c8ba819c9110
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 20:42:55 2012 +0100

    sna: Do not use the GPU to migrate to the CPU whilst wedged!
    
    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 4596a7a..04dacf1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1126,6 +1126,9 @@ static inline bool use_cpu_bo_for_download(struct sna *sna,
 	if (DBG_NO_CPU_DOWNLOAD)
 		return false;
 
+	if (wedged(sna))
+		return false;
+
 	if (priv->cpu_bo == NULL || !sna->kgem.can_blt_cpu)
 		return false;
 
@@ -2144,6 +2147,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 
 	assert_pixmap_damage(pixmap);
 	assert_pixmap_contains_box(pixmap, box);
+	assert(!wedged(sna));
 
 	if (sna_damage_is_all(&priv->gpu_damage,
 			      pixmap->drawable.width,
commit fe05268d70088c8cad5f4b5ef756e1ffe2069fca
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 19:28:42 2012 +0100

    sna: Experiment with flushing the batch prior to rendering to a ShmPixmap
    
    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 0cd4b77..4596a7a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2572,8 +2572,11 @@ use_cpu_bo:
 		*damage = &priv->cpu_damage;
 
 	if (priv->shm) {
+		struct sna *sna = to_sna_from_pixmap(pixmap);
 		assert(!priv->flush);
-		add_flush_pixmap(to_sna_from_pixmap(pixmap), priv);
+		add_flush_pixmap(sna, priv);
+		if (!kgem_bo_is_busy(priv->cpu_bo))
+			kgem_submit(&sna->kgem);
 	}
 
 	DBG(("%s: using CPU bo with damage? %d\n",
commit bbd7a825810cc9772e6d613df449cb5ecb0be3f6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 19:28:20 2012 +0100

    sna: Don't promote a ShmPixmap to GPU for a CopyArea
    
    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 2a022e6..0cd4b77 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3836,6 +3836,8 @@ move_to_gpu(PixmapPtr pixmap, struct sna_pixmap *priv,
 	} else {
 		if ((priv->create & KGEM_CAN_CREATE_GPU) == 0)
 			return false;
+		if (priv->shm)
+			return false;
 	}
 
 	count = priv->source_count++;
@@ -3947,7 +3949,7 @@ sna_self_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	if (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))
 		goto fallback;
 
-	if (priv->gpu_bo) {
+	if (priv->gpu_damage) {
 		if (alu == GXcopy && priv->clear)
 			goto out;
 
commit 7bf7a5ad1057f1aeb5b261da6dc501323c022287
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 19:17:35 2012 +0100

    sna/gen3: Tidy vbo discard
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 5b0894e..48f104e 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1652,6 +1652,7 @@ static int gen3_vertex_finish(struct sna *sna)
 		sna->render.vbo = NULL;
 		return 0;
 	}
+	assert(sna->render.vbo->snoop == false);
 
 	if (sna->render.vertex_used) {
 		memcpy(sna->render.vertices,
@@ -1710,10 +1711,12 @@ static void gen3_vertex_close(struct sna *sna)
 			     sna->render.vertex_used));
 			bo = kgem_create_linear(&sna->kgem,
 						4*sna->render.vertex_used, 0);
-			if (bo)
+			if (bo) {
+				assert(sna->render.vbo->snoop == false);
 				kgem_bo_write(&sna->kgem, bo,
 					      sna->render.vertex_data,
 					      4*sna->render.vertex_used);
+			}
 			free_bo = bo;
 		}
 	}
@@ -1967,9 +1970,10 @@ gen3_render_reset(struct sna *sna)
 	state->last_vertex_offset = 0;
 	state->vertex_offset = 0;
 
-	if (sna->render.vbo &&
+	if (sna->render.vbo != NULL &&
 	    !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) {
-		DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
+		DBG(("%s: discarding vbo as next access will stall: %d\n",
+		     __FUNCTION__, sna->render.vbo->presumed_offset));
 		discard_vbo(sna);
 	}
 }
@@ -1980,7 +1984,8 @@ gen3_render_retire(struct kgem *kgem)
 	struct sna *sna;
 
 	sna = container_of(kgem, struct sna, kgem);
-	if (kgem->nbatch == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) {
+	if (sna->render.vertex_reloc[0] == 0 &&
+	    sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) {
 		DBG(("%s: resetting idle vbo\n", __FUNCTION__));
 		sna->render.vertex_used = 0;
 		sna->render.vertex_index = 0;
commit d1b808fd72b477bde96f7c6737a993bd1a20baf2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 17:53:24 2012 +0100

    sna: Tweak is_cpu/is_gpu heuristics
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 0024f99..3849a88 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -75,24 +75,32 @@ is_gpu(DrawablePtr drawable)
 	if (priv == NULL || priv->clear)
 		return false;
 
-	if (DAMAGE_IS_ALL(priv->gpu_damage) ||
-	    (priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo) && !priv->gpu_bo->proxy))
+	if (priv->cpu_damage == NULL)
 		return true;
 
-	return priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo);
+	if (priv->gpu_damage && !priv->gpu_bo->proxy)
+		return true;
+
+	if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo))
+		return true;
+
+	return priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo);
 }
 
 static inline bool
 is_cpu(DrawablePtr drawable)
 {
 	struct sna_pixmap *priv = sna_pixmap_from_drawable(drawable);
-	if (priv == NULL || priv->gpu_bo == NULL || priv->clear)
+	if (priv == NULL || priv->clear)
 		return true;
 
-	if (priv->gpu_damage && kgem_bo_is_busy(priv->gpu_bo))
+	if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo))
 		return false;
 
-	if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo))
+	if (DAMAGE_IS_ALL(priv->cpu_damage))
+		return true;
+
+	if (priv->gpu_damage && kgem_bo_is_busy(priv->gpu_bo))
 		return false;
 
 	return true;
commit c682c1a37692021cbd9bfc1e3f1ccf2b648c73f9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 17:28:25 2012 +0100

    sna: Discard GPU (and damage) after applying clear on migration to CPU
    
    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 1723757..2a022e6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1326,7 +1326,6 @@ skip_inplace_map:
 			assert(!priv->shm);
 			sna_pixmap_free_cpu(sna, priv);
 		}
-		sna_damage_destroy(&priv->gpu_damage);
 	}
 
 	if (pixmap->devPrivate.ptr == NULL &&
@@ -1355,6 +1354,11 @@ skip_inplace_map:
 				    priv->clear_color);
 		}
 
+		sna_damage_all(&priv->cpu_damage,
+			       pixmap->drawable.width,
+			       pixmap->drawable.height);
+		sna_pixmap_free_gpu(sna, priv);
+		priv->undamaged = false;
 		priv->clear = false;
 	}
 
commit dc83ef49f9e8ff94ab77aa9d54fe29e32b9d7a3d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 17:20:45 2012 +0100

    sna/trapezoids: Accept more operators for maybe-inplace
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 0dcb971..6cc03f9 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -4671,22 +4671,41 @@ trapezoid_spans_maybe_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 	if (is_mono(dst, maskFormat))
 		goto out;
 
-	if (!sna_picture_is_solid(src, NULL))
-		return false;
-
 	switch ((int)dst->format) {
 	case PICT_a8:
+		if (!sna_picture_is_solid(src, NULL))
+			return false;
+
+		switch (op) {
+		case PictOpIn:
+		case PictOpAdd:
+		case PictOpSrc:
+			break;
+		default:
+			return false;
+		}
+		break;
+
 	case PICT_x8r8g8b8:
 	case PICT_a8r8g8b8:
-		break;
-	default:
-		return false;
-	}
+		if (picture_is_gpu(src))
+			return false;
 
-	switch (op) {
-	case PictOpIn:
-	case PictOpAdd:
-	case PictOpSrc:
+		switch (op) {
+		case PictOpOver:
+		case PictOpAdd:
+		case PictOpOutReverse:
+			break;
+		case PictOpSrc:
+			if (sna_picture_is_solid(src, NULL))
+				break;
+
+			if (!sna_drawable_is_clear(dst->pDrawable))
+				return false;
+			break;
+		default:
+			return false;
+		}
 		break;
 	default:
 		return false;
commit 47d948f5df0cd0e975cfe5183b6ce79cd3fd27ee
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 17:09:21 2012 +0100

    sna: Update maybe_inplace to recognise more types of handled pixel formats
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index a1141f1..0dcb971 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -4674,8 +4674,14 @@ trapezoid_spans_maybe_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 	if (!sna_picture_is_solid(src, NULL))
 		return false;
 
-	if (dst->format != PICT_a8)
+	switch ((int)dst->format) {
+	case PICT_a8:
+	case PICT_x8r8g8b8:
+	case PICT_a8r8g8b8:
+		break;
+	default:
 		return false;
+	}
 
 	switch (op) {
 	case PictOpIn:
commit 02963f489b177d0085006753e91e240545933387
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 19 15:45:35 2012 +0100

    sna: Only submit the batch if flushing a DRI client bo
    
    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 31a9d3d..1723757 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13362,13 +13362,13 @@ sna_accel_flush_callback(CallbackListPtr *list,
 		} else {
 			DBG(("%s: flushing DRI pixmap=%ld\n", __FUNCTION__,
 			     priv->pixmap->drawable.serialNumber));
-			ret = sna_pixmap_move_to_gpu(priv->pixmap,
-						     MOVE_READ | __MOVE_FORCE);
+			if (sna_pixmap_move_to_gpu(priv->pixmap,
+						     MOVE_READ | __MOVE_FORCE))
+				kgem_bo_submit(&sna->kgem, priv->gpu_bo);
 		}
 		(void)ret;
 	}
 
-	kgem_submit(&sna->kgem);
 	sna->kgem.flush = false;
 }
 


More information about the xorg-commit mailing list