xf86-video-intel: 2 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/gen8_render.c src/sna/sna_blt.c src/sna/sna_composite.c src/sna/sna.h src/sna/sna_transform.c tools/virtual.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Mar 14 07:36:06 PDT 2014


 src/sna/gen2_render.c   |    2 +-
 src/sna/gen3_render.c   |    4 ++--
 src/sna/gen4_render.c   |    2 +-
 src/sna/gen5_render.c   |    2 +-
 src/sna/gen6_render.c   |   36 +++++++++++++++++++++++++++++++++---
 src/sna/gen7_render.c   |    2 +-
 src/sna/gen8_render.c   |    2 +-
 src/sna/sna.h           |    7 +++++--
 src/sna/sna_blt.c       |    4 +++-
 src/sna/sna_composite.c |    4 +++-
 src/sna/sna_transform.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 tools/virtual.c         |   17 +++++++++++------
 12 files changed, 106 insertions(+), 20 deletions(-)

New commits:
commit 5079830bd5f01740c4cbf84888bdf7a93bb2868e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Mar 14 14:34:48 2014 +0000

    intel-virtual-output: Mode names are freed with ScreenResources
    
    So we have to be careful not to continue to reference the strings after
    they may be freed.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 0dfd308..9e267be 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1151,9 +1151,9 @@ static int context_update(struct context *ctx)
 			RRCrtc rr_crtc;
 			Status ret;
 
-			DBG(("%s: copying configuration from %s (mode=%ld: %s) to %s\n",
+			DBG(("%s: copying configuration from %s (mode=%ld: %dx%d) to %s\n",
 			     DisplayString(dst->dpy),
-			     src->name, (long)src->mode.id, src->mode.name,
+			     src->name, (long)src->mode.id, src->mode.width, src->mode.height,
 			     dst->name));
 
 			if (src->mode.id == 0) {
@@ -1188,15 +1188,20 @@ err:
 				/* XXX User names must be unique! */
 				m = src->mode;
 				m.nameLength = snprintf(buf, sizeof(buf),
-							"%s.%ld-%s", src->name, (long)src->mode.id, src->mode.name);
+							"%s.%ld-%dx%d", src->name,
+							(long)src->mode.id,
+							src->mode.width,
+							src->mode.height);
 				m.name = buf;
 
 				id = XRRCreateMode(dst->dpy, dst->window, &m);
 				if (id) {
-					DBG(("%s: adding mode %ld: %s to %s\n",
+					DBG(("%s: adding mode %ld: %dx%d to %s, new mode %ld\n",
 					     DisplayString(dst->dpy),
-					     (long)id, src->mode.name,
-					     dst->name));
+					     (long)src->mode.id,
+					     src->mode.width,
+					     src->mode.height,
+					     dst->name (long)id,));
 					XRRAddOutputMode(dst->dpy, dst->rr_output, id);
 					dst->mode.id = id;
 				} else {
commit c64d2572bafeacae25e9b58c8372ce91858c3832
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Mar 14 13:08:43 2014 +0000

    sna: Allow some leeway when deciding to discard common translations
    
    Under PictFilterNearest, we can ignore fractional translations (not all
    renderers discard those.) And if we are being approximate, we can loosen
    our tolerance as well.
    
    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 2ebfde6..e3931e3 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1550,7 +1550,7 @@ gen2_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 69f4668..bb98beb 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2859,7 +2859,7 @@ static bool gen3_gradient_setup(struct sna *sna,
 	channel->card_format = MAPSURF_32BIT | MT_32BIT_ARGB8888;
 	channel->filter = PictFilterNearest;
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, PictFilterNearest, false, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		ox += dx;
@@ -3086,7 +3086,7 @@ gen3_composite_picture(struct sna *sna,
 	x += dx + picture->pDrawable->x;
 	y += dy + picture->pDrawable->y;
 
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index f377315..88db06e 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1577,7 +1577,7 @@ gen4_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index e4db739..5508d49 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1516,7 +1516,7 @@ gen5_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 577d1c0..f1f7946 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1713,8 +1713,8 @@ gen6_composite_picture(struct sna *sna,
 	uint32_t color;
 	int16_t dx, dy;
 
-	DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d)\n",
-	     __FUNCTION__, x, y, w, h, dst_x, dst_y));
+	DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d), precise=%d\n",
+	     __FUNCTION__, x, y, w, h, dst_x, dst_y, precise));
 
 	channel->is_solid = false;
 	channel->card_format = -1;
@@ -1766,7 +1766,7 @@ gen6_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
@@ -1790,6 +1790,36 @@ gen6_composite_picture(struct sna *sna,
 						  x, y, w, h, dst_x, dst_y);
 	}
 
+	DBG(("%s: pixmap, repeat=%d, filter=%d, transform?=%d [affine? %d], format=%08x\n",
+	     __FUNCTION__,
+	     channel->repeat, channel->filter,
+	     channel->transform != NULL, channel->is_affine,
+	     channel->pict_format));
+	if (channel->transform) {
+#define f2d(x) (((double)(x))/65536.)
+		DBG(("%s: transform=[%f %f %f, %f %f %f, %f %f %f] (raw [%x %x %x, %x %x %x, %x %x %x])\n",
+		     __FUNCTION__,
+		     f2d(channel->transform->matrix[0][0]),
+		     f2d(channel->transform->matrix[0][1]),
+		     f2d(channel->transform->matrix[0][2]),
+		     f2d(channel->transform->matrix[1][0]),
+		     f2d(channel->transform->matrix[1][1]),
+		     f2d(channel->transform->matrix[1][2]),
+		     f2d(channel->transform->matrix[2][0]),
+		     f2d(channel->transform->matrix[2][1]),
+		     f2d(channel->transform->matrix[2][2]),
+		     channel->transform->matrix[0][0],
+		     channel->transform->matrix[0][1],
+		     channel->transform->matrix[0][2],
+		     channel->transform->matrix[1][0],
+		     channel->transform->matrix[1][1],
+		     channel->transform->matrix[1][2],
+		     channel->transform->matrix[2][0],
+		     channel->transform->matrix[2][1],
+		     channel->transform->matrix[2][2]));
+#undef f2d
+	}
+
 	return sna_render_pixmap_bo(sna, channel, pixmap,
 				    x, y, w, h, dst_x, dst_y);
 }
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 4f61661..6c1fe26 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2029,7 +2029,7 @@ gen7_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index ddf376b..9e63483 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -1806,7 +1806,7 @@ gen8_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 4651632..f0ddda5 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -764,10 +764,13 @@ sna_get_transformed_coordinates_3d(int x, int y,
 				   float *x_out, float *y_out, float *z_out);
 
 bool sna_transform_is_affine(const PictTransform *t);
-bool sna_transform_is_integer_translation(const PictTransform *t,
-					  int16_t *tx, int16_t *ty);
 bool sna_transform_is_translation(const PictTransform *t,
 				  pixman_fixed_t *tx, pixman_fixed_t *ty);
+bool sna_transform_is_integer_translation(const PictTransform *t,
+					  int16_t *tx, int16_t *ty);
+bool sna_transform_is_imprecise_integer_translation(const PictTransform *t,
+					       int filter, bool precise,
+					       int16_t *tx, int16_t *ty);
 static inline bool
 sna_affine_transform_is_rotation(const PictTransform *t)
 {
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 302a00b..41058c6 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2515,7 +2515,9 @@ fill:
 		return false;
 	}
 
-	if (!sna_transform_is_integer_translation(src->transform, &tx, &ty)) {
+	if (sna_transform_is_imprecise_integer_translation(src->transform, src->filter,
+							   dst->polyMode == PolyModePrecise,
+							   &tx, &ty)) {
 		DBG(("%s: source transform is not an integer translation\n",
 		     __FUNCTION__));
 		return false;
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 74dfc9e..d34b517 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -527,7 +527,9 @@ sna_composite_fb(CARD8 op,
 	    src->filter != PictFilterConvolution &&
 	    (op == PictOpSrc || (op == PictOpOver && !PICT_FORMAT_A(src->format))) &&
 	    (dst->format == src->format || dst->format == alphaless(src->format)) &&
-	    sna_transform_is_integer_translation(src->transform, &tx, &ty)) {
+	    sna_transform_is_imprecise_integer_translation(src->transform, src->filter,
+							   dst->polyMode == PolyModePrecise,
+							   &tx, &ty)) {
 		PixmapPtr dst_pixmap = get_drawable_pixmap(dst->pDrawable);
 		PixmapPtr src_pixmap = get_drawable_pixmap(src->pDrawable);
 		int16_t sx = src_x + tx - (dst->pDrawable->x + dst_x);
diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c
index 55cc1ad..57d1987 100644
--- a/src/sna/sna_transform.c
+++ b/src/sna/sna_transform.c
@@ -96,6 +96,50 @@ sna_transform_is_integer_translation(const PictTransform *t, int16_t *tx, int16_
 	return true;
 }
 
+bool
+sna_transform_is_imprecise_integer_translation(const PictTransform *t,
+					       int filter, bool precise,
+					       int16_t *tx, int16_t *ty)
+{
+	if (t == NULL) {
+		*tx = *ty = 0;
+		return true;
+	}
+
+	if (t->matrix[0][0] != IntToxFixed(1) ||
+	    t->matrix[0][1] != 0 ||
+	    t->matrix[1][0] != 0 ||
+	    t->matrix[1][1] != IntToxFixed(1) ||
+	    t->matrix[2][0] != 0 ||
+	    t->matrix[2][1] != 0 ||
+	    t->matrix[2][2] != IntToxFixed(1))
+		return false;
+
+	DBG(("%s: filter=%d, translation (%x, %x), precise? %d\n",
+	     __FUNCTION__, filter, t->matrix[0][2], t->matrix[1][2], precise));
+	if (filter != PictFilterNearest) {
+		if (precise) {
+			if (pixman_fixed_fraction(t->matrix[0][2]) ||
+			    pixman_fixed_fraction(t->matrix[1][2]))
+				return false;
+		} else {
+			int f;
+
+			f = pixman_fixed_fraction(t->matrix[0][2]);
+			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4)
+				return false;
+
+			f = pixman_fixed_fraction(t->matrix[1][2]);
+			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4)
+				return false;
+		}
+	}
+
+	*tx = pixman_fixed_to_int(t->matrix[0][2] + IntToxFixed(1)/2);
+	*ty = pixman_fixed_to_int(t->matrix[1][2] + IntToxFixed(1)/2);
+	return true;
+}
+
 /**
  * Returns the floating-point coordinates transformed by the given transform.
  */


More information about the xorg-commit mailing list