xf86-video-intel: 6 commits - src/sna/gen3_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_composite.c src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Mar 14 13:21:49 PDT 2012


 src/sna/gen3_render.c    |    4 -
 src/sna/kgem.c           |    1 
 src/sna/kgem.h           |    1 
 src/sna/sna_accel.c      |    3 
 src/sna/sna_composite.c  |    5 +
 src/sna/sna_trapezoids.c |  163 ++++++++++++++++++++++++++++++++++++-----------
 6 files changed, 136 insertions(+), 41 deletions(-)

New commits:
commit d0e05b4294b2f150a41dd95d52c2e6ee8479283d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 20:19:30 2012 +0000

    sna: Don't mark cached upload buffers for inactivity expiration
    
    As these do not follow the normal rules of damage tracking, we have to
    be careful not to force migration.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=42426
    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 ce13982..e957b1b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2073,7 +2073,8 @@ static inline struct sna_pixmap *
 sna_pixmap_mark_active(struct sna *sna, struct sna_pixmap *priv)
 {
 	assert(priv->gpu_bo);
-	if (!priv->pinned && (priv->create & KGEM_CAN_CREATE_LARGE) == 0)
+	if (!priv->pinned && priv->gpu_bo->proxy == NULL &&
+	    (priv->create & KGEM_CAN_CREATE_LARGE) == 0)
 		list_move(&priv->inactive, &sna->active_pixmaps);
 	priv->clear = false;
 	return priv;
commit 96ead26c4dddab637875c74a9afca6fd6662352b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 19:56:42 2012 +0000

    sna: Add a couple of asserts for inactive_partial reference counting
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 72751f3..761218f 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1257,6 +1257,7 @@ static void kgem_retire_partials(struct kgem *kgem)
 			kgem_bo_destroy(kgem, cached);
 		}
 
+		assert(bo->base.refcnt > 0);
 		if (bo->base.refcnt != 1)
 			continue;
 
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 52e5e9c..7e5ffac 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -270,6 +270,7 @@ static inline void kgem_bo_flush(struct kgem *kgem, struct kgem_bo *bo)
 
 static inline struct kgem_bo *kgem_bo_reference(struct kgem_bo *bo)
 {
+	assert(bo->refcnt);
 	bo->refcnt++;
 	return bo;
 }
commit 6a4ac18e37521d54dc36b215cbd27c56d20b2922
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 11:51:39 2012 +0000

    sna/traps: Use a more direct fallback path for the CPU
    
    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 f05324f..f0f48e8 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2423,44 +2423,63 @@ trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 
 		DBG(("%s: mask (%dx%d) depth=%d, format=%08x\n",
 		     __FUNCTION__, width, height, depth, format));
-		scratch = sna_pixmap_create_upload(screen,
-						   width, height, 8,
-						   KGEM_BUFFER_WRITE);
-		if (!scratch)
-			return;
+		if (is_gpu(dst->pDrawable) || picture_is_gpu(src)) {
+			scratch = sna_pixmap_create_upload(screen,
+							   width, height, 8,
+							   KGEM_BUFFER_WRITE);
+			if (!scratch)
+				return;
 
-		if (depth < 8) {
-			image = pixman_image_create_bits(format, width, height,
-							 NULL, 0);
+			if (depth < 8) {
+				image = pixman_image_create_bits(format, width, height,
+								 NULL, 0);
+			} else {
+				memset(scratch->devPrivate.ptr, 0, scratch->devKind*height);
+				image = pixman_image_create_bits(format, width, height,
+								 scratch->devPrivate.ptr,
+								 scratch->devKind);
+			}
+			if (image) {
+				for (; ntrap; ntrap--, traps++)
+					pixman_rasterize_trapezoid(image,
+								   (pixman_trapezoid_t *)traps,
+								   -bounds.x1, -bounds.y1);
+				if (depth < 8) {
+					pixman_image_t *a8;
+
+					a8 = pixman_image_create_bits(PIXMAN_a8, width, height,
+								      scratch->devPrivate.ptr,
+								      scratch->devKind);
+					if (a8) {
+						pixman_image_composite(PIXMAN_OP_SRC,
+								       image, NULL, a8,
+								       0, 0,
+								       0, 0,
+								       0, 0,
+								       width, height);
+						pixman_image_unref (a8);
+					}
+				}
+
+				pixman_image_unref(image);
+			}
 		} else {
+			scratch = screen->CreatePixmap(screen,
+						       width, height, depth,
+						       CREATE_PIXMAP_USAGE_SCRATCH);
+			if (!scratch)
+				return;
+
 			memset(scratch->devPrivate.ptr, 0, scratch->devKind*height);
 			image = pixman_image_create_bits(format, width, height,
 							 scratch->devPrivate.ptr,
 							 scratch->devKind);
-		}
-		if (image) {
-			for (; ntrap; ntrap--, traps++)
-				pixman_rasterize_trapezoid(image,
-							   (pixman_trapezoid_t *)traps,
-							   -bounds.x1, -bounds.y1);
-			if (depth < 8) {
-				pixman_image_t *a8;
-
-				a8 = pixman_image_create_bits(PIXMAN_a8, width, height,
-							      scratch->devPrivate.ptr,
-							      scratch->devKind);
-				if (a8) {
-					pixman_image_composite(PIXMAN_OP_SRC,
-							       image, NULL, a8,
-							       0, 0,
-							       0, 0,
-							       0, 0,
-							       width, height);
-					pixman_image_unref (a8);
-				}
+			if (image) {
+				for (; ntrap; ntrap--, traps++)
+					pixman_rasterize_trapezoid(image,
+								   (pixman_trapezoid_t *)traps,
+								   -bounds.x1, -bounds.y1);
 			}
-
-			pixman_image_unref(image);
 		}
 
 		mask = CreatePicture(0, &scratch->drawable,
commit 8580677ee6725144acf63f5cc2f8097376352d6e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 11:46:18 2012 +0000

    sna/traps: Rasterise using pixman inplace where appropriate
    
    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 933f580..f05324f 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2302,6 +2302,79 @@ trapezoids_bounds(int n, const xTrapezoid *t, BoxPtr box)
 	box->y2 = pixman_fixed_integer_ceil(y2);
 }
 
+static bool
+is_mono(PicturePtr dst, PictFormatPtr mask)
+{
+	return mask ? mask->depth < 8 : dst->polyEdge==PolyEdgeSharp;
+}
+
+static bool
+trapezoids_inplace_fallback(CARD8 op,
+			    PicturePtr src, PicturePtr dst, PictFormatPtr mask,
+			    int ntrap, xTrapezoid *traps)
+{
+	pixman_image_t *image;
+	BoxRec box;
+	uint32_t color;
+	int dx, dy;
+
+	if (op != PictOpAdd)
+		return false;
+
+	if (is_mono(dst, mask)) {
+		if (dst->format != PICT_a1)
+			return false;
+	} else {
+		if (dst->format != PICT_a8)
+			return false;
+	}
+
+	if (!sna_picture_is_solid(src, &color) || (color >> 24) != 0xff) {
+		DBG(("%s: not an opaque solid source\n", __FUNCTION__));
+		return false;
+	}
+
+	box.x1 = dst->pDrawable->x;
+	box.y1 = dst->pDrawable->y;
+	box.x2 = dst->pDrawable->width;
+	box.y2 = dst->pDrawable->height;
+	if (pixman_region_contains_rectangle(dst->pCompositeClip,
+					     &box) != PIXMAN_REGION_IN) {
+		DBG(("%s: requires clipping, drawable (%d,%d), (%d, %d), clip (%d, %d), (%d, %d)\n", __FUNCTION__,
+		     box.x1, box.y1, box.x2, box.y2,
+		     dst->pCompositeClip->extents.x1,
+		     dst->pCompositeClip->extents.y1,
+		     dst->pCompositeClip->extents.x2,
+		     dst->pCompositeClip->extents.y2));
+		return false;
+	}
+
+	if (is_gpu(dst->pDrawable)) {
+		DBG(("%s: not performing inplace as dst is already on the GPU\n",
+		     __FUNCTION__));
+		return false;
+	}
+
+	DBG(("%s\n", __FUNCTION__));
+
+	image = NULL;
+	if (sna_drawable_move_to_cpu(dst->pDrawable, MOVE_READ | MOVE_WRITE))
+		image = image_from_pict(dst, FALSE, &dx, &dy);
+	if (image) {
+		dx += dst->pDrawable->x;
+		dy += dst->pDrawable->y;
+
+		for (; ntrap; ntrap--, traps++)
+			pixman_rasterize_trapezoid(image,
+						   (pixman_trapezoid_t *)traps,
+						   dx, dy);
+
+		pixman_image_unref(image);
+	}
+
+	return true;
+}
+
 static void
 trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 		    PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
@@ -2998,12 +3071,6 @@ project_trapezoid_onto_grid(const xTrapezoid *in,
 	return xTrapezoidValid(out);
 }
 
-static bool
-is_mono(PicturePtr dst, PictFormatPtr mask)
-{
-	return mask ? mask->depth < 8 : dst->polyEdge==PolyEdgeSharp;
-}
-
 static span_func_t
 choose_span(PicturePtr dst,
 	    PictFormatPtr maskFormat,
@@ -4448,6 +4515,9 @@ fallback:
 				    xSrc, ySrc, ntrap, traps))
 		return;
 
+	if (trapezoids_inplace_fallback(op, src, dst, maskFormat, ntrap, traps))
+		return;
+
 	DBG(("%s: fallback mask=%08x, ntrap=%d\n", __FUNCTION__,
 	     maskFormat ? (unsigned)maskFormat->format : 0, ntrap));
 	trapezoids_fallback(op, src, dst, maskFormat,
commit 8a303f195b53a78dcbb2b6c84e7e691bedc86d25
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 11:26:03 2012 +0000

    sna: Remove existing damage before overwriting with a composite op
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index a610e7c..b098fcc 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -479,6 +479,11 @@ sna_composite(CARD8 op,
 	     get_drawable_dx(dst->pDrawable),
 	     get_drawable_dy(dst->pDrawable)));
 
+	if (op <= PictOpSrc) {
+		struct sna_pixmap *priv = sna_pixmap_from_drawable(dst->pDrawable);
+		sna_damage_subtract(&priv->cpu_damage, &region);
+	}
+
 	memset(&tmp, 0, sizeof(tmp));
 	if (!sna->render.composite(sna,
 				   op, src, mask, dst,
commit 63eeb98463a77adadc26d9de1e640b75eefebf1a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Mar 14 10:30:47 2012 +0000

    sna/gen3: Look harder to see if we can indeed use the BLT for composite
    
    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 d3ed2ef..c567d6b 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2744,15 +2744,13 @@ gen3_render_composite(struct sna *sna,
 					    width,  height,
 					    tmp);
 
-	memset(&tmp->u.gen3, 0, sizeof(tmp->u.gen3));
-
 	if (!gen3_composite_set_target(sna, tmp, dst)) {
 		DBG(("%s: unable to set render target\n",
 		     __FUNCTION__));
 		return FALSE;
 	}
 
-	if (mask == NULL && sna->kgem.mode == KGEM_BLT  &&
+	if (mask == NULL && sna->kgem.mode != KGEM_RENDER &&
 	    sna_blt_composite(sna, op,
 			      src, dst,
 			      src_x, src_y,


More information about the xorg-commit mailing list