xf86-video-intel: 4 commits - src/sna/gen4_vertex.c src/sna/gen7_render.c src/sna/sna_composite.c src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Thu May 9 05:54:24 PDT 2013


 src/sna/gen4_vertex.c    |    6 +++
 src/sna/gen7_render.c    |   19 ++++++++++
 src/sna/sna_composite.c  |    9 ++---
 src/sna/sna_trapezoids.c |   83 ++++++++++++++++++++++++++++-------------------
 4 files changed, 81 insertions(+), 36 deletions(-)

New commits:
commit 2217f6356b53263b6ce8f92b5c29c0614d4ef2a5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 9 13:46:11 2013 +0100

    sna/trapezoids: Fix the determination of the trapezoid origin
    
    "src-x and src-y register the pattern to
    the floor of the top x and y coordinate of the left edge of the
    first trapezoid,"
    
    Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1178020
    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 7536f25..7907e8d 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2476,6 +2476,17 @@ static void rasterize_traps_thread(void *arg)
 	pixman_image_unref(image);
 }
 
+inline static void trapezoid_origin(const xLineFixed *l, int16_t *x, int16_t *y)
+{
+	if (l->p1.y < l->p2.y) {
+		*x = pixman_fixed_to_int(l->p1.x);
+		*y = pixman_fixed_to_int(l->p1.y);
+	} else {
+		*x = pixman_fixed_to_int(l->p2.x);
+		*y = pixman_fixed_to_int(l->p2.y);
+	}
+}
+
 static void
 trapezoids_fallback(struct sna *sna,
 		    CARD8 op, PicturePtr src, PicturePtr dst,
@@ -2494,8 +2505,7 @@ trapezoids_fallback(struct sna *sna,
 		pixman_format_code_t format;
 		int error;
 
-		dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
-		dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+		trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
 
 		trapezoids_bounds(ntrap, traps, &bounds);
 		if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
@@ -3823,8 +3833,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
 					      force_fallback))
 		return true;
 
-	dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
-	dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+	trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
 	dx = dst->pDrawable->x;
 	dy = dst->pDrawable->y;
 	for (n = 0; n < ntrap; n++) {
@@ -3948,9 +3957,11 @@ fallback:
 							  force_fallback);
 	}
 
-	dst_x = extents.x1 = pixman_fixed_to_int(traps[0].left.p1.x);
+	trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
+
+	extents.x1 = pixman_fixed_to_int(traps[0].left.p1.x);
 	extents.x2 = pixman_fixed_to_int(traps[0].right.p1.x + pixman_fixed_1_minus_e);
-	dst_y = extents.y1 = pixman_fixed_to_int(traps[0].top);
+	extents.y1 = pixman_fixed_to_int(traps[0].top);
 	extents.y2 = pixman_fixed_to_int(traps[0].bottom + pixman_fixed_1_minus_e);
 
 	DBG(("%s: src=(%d, %d), dst=(%d, %d)\n",
@@ -4212,8 +4223,7 @@ mono_trapezoids_span_converter(struct sna *sna,
 	if (NO_SCAN_CONVERTER)
 		return false;
 
-	dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
-	dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+	trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
 
 	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
@@ -4568,8 +4578,7 @@ trapezoid_span_converter(struct sna *sna,
 		return false;
 	}
 
-	dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
-	dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
+	trapezoid_origin(&traps[0].left, &dst_x, &dst_y);
 
 	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
commit 6e98df06fa9d218a6139730140a83a1940b05980
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 9 13:45:38 2013 +0100

    sna: Add more debugging to unaligned trapezoids
    
    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 2b46f62..df2aa1a 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -404,8 +404,8 @@ static void _assert_pixmap_contains_box(PixmapPtr pixmap, BoxPtr box, const char
 
 static void apply_damage(struct sna_composite_op *op, RegionPtr region)
 {
-	DBG(("%s: damage=%p, region=%ld [(%d, %d), (%d, %d) + (%d, %d)]\n",
-	     __FUNCTION__, op->damage, RegionNumRects(region),
+	DBG(("%s: damage=%p, region=%d [(%d, %d), (%d, %d) + (%d, %d)]\n",
+	     __FUNCTION__, op->damage, (int)RegionNumRects(region),
 	     region->extents.x1, region->extents.y1,
 	     region->extents.x2, region->extents.y2,
 	     op->dst.x, op->dst.y));
@@ -995,8 +995,9 @@ sna_composite_rectangles(CARD8		 op,
 							     color->alpha,
 							     dst->format);
 			priv->clear = ok;
-			DBG(("%s: marking clear [%08x]? %d\n",
-			     __FUNCTION__, priv->clear_color, ok));
+			DBG(("%s: pixmap=%ld marking clear [%08x]? %d\n",
+			     __FUNCTION__, pixmap->drawable.serialNumber,
+			     priv->clear_color, ok));
 		}
 	}
 	goto done;
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index ce0835a..7536f25 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2671,7 +2671,7 @@ composite_aligned_boxes(struct sna *sna,
 			PicturePtr dst,
 			PictFormatPtr maskFormat,
 			INT16 src_x, INT16 src_y,
-			int ntrap, xTrapezoid *traps,
+			int ntrap, const xTrapezoid *traps,
 			bool force_fallback)
 {
 	BoxRec stack_boxes[64], *boxes;
@@ -2888,7 +2888,7 @@ composite_unaligned_box(struct sna *sna,
 inline static void
 composite_unaligned_trap_row(struct sna *sna,
 			     struct sna_composite_spans_op *tmp,
-			     xTrapezoid *trap, int dx,
+			     const xTrapezoid *trap, int dx,
 			     int y1, int y2, int covered,
 			     pixman_region16_t *clip)
 {
@@ -2966,7 +2966,7 @@ composite_unaligned_trap_row(struct sna *sna,
 flatten static void
 composite_unaligned_trap(struct sna *sna,
 			struct sna_composite_spans_op *tmp,
-			xTrapezoid *trap,
+			const xTrapezoid *trap,
 			int dx, int dy,
 			pixman_region16_t *clip)
 {
@@ -2975,6 +2975,8 @@ composite_unaligned_trap(struct sna *sna,
 	y1 = dy + pixman_fixed_to_int(trap->top);
 	y2 = dy + pixman_fixed_to_int(trap->bottom);
 
+	DBG(("%s: y1=%d, y2=%d\n", __FUNCTION__, y1, y2));
+
 	if (y1 == y2) {
 		composite_unaligned_trap_row(sna, tmp, trap, dx,
 					     y1, y1 + 1,
@@ -3006,9 +3008,9 @@ composite_unaligned_trap(struct sna *sna,
 		BoxRec box;
 
 		box.x1 = dx + pixman_fixed_to_int(trap->left.p1.x);
-		box.x2 = dx + pixman_fixed_to_int(trap->right.p1.x);
-		box.y1 = y1;
-		box.y2 = y2 + (pixman_fixed_frac(trap->bottom) != 0);
+		box.x2 = dx + pixman_fixed_to_int(trap->right.p1.x + pixman_fixed_1_minus_e);
+		box.y1 = dy + pixman_fixed_to_int(trap->top);
+		box.y2 = dy + pixman_fixed_to_int(trap->bottom + pixman_fixed_1_minus_e);
 
 		if (clip) {
 			pixman_region16_t region;
@@ -3058,7 +3060,7 @@ blt_opacity(PixmapPtr scratch,
 static void
 blt_unaligned_box_row(PixmapPtr scratch,
 		      BoxPtr extents,
-		      xTrapezoid *trap,
+		      const xTrapezoid *trap,
 		      int y1, int y2,
 		      int covered)
 {
@@ -3188,7 +3190,7 @@ lerp32_opacity(PixmapPtr scratch,
 static void
 lerp32_unaligned_box_row(PixmapPtr scratch, uint32_t color,
 			 const BoxRec *extents,
-			 xTrapezoid *trap, int16_t dx,
+			 const xTrapezoid *trap, int16_t dx,
 			 int16_t y, int16_t h,
 			 uint8_t covered)
 {
@@ -3286,7 +3288,7 @@ pixsolid_opacity(struct pixman_inplace *pi,
 static void
 pixsolid_unaligned_box_row(struct pixman_inplace *pi,
 			   const BoxRec *extents,
-			   xTrapezoid *trap,
+			   const xTrapezoid *trap,
 			   int16_t y, int16_t h,
 			   uint8_t covered)
 {
@@ -3320,7 +3322,8 @@ pixsolid_unaligned_box_row(struct pixman_inplace *pi,
 static bool
 composite_unaligned_boxes_inplace__solid(struct sna *sna,
 					 CARD8 op, uint32_t color,
-					 PicturePtr dst, int n, xTrapezoid *t,
+					 PicturePtr dst,
+					 int n, const xTrapezoid *t,
 					 bool force_fallback)
 {
 	PixmapPtr pixmap;
@@ -3646,7 +3649,7 @@ static bool
 composite_unaligned_boxes_inplace(struct sna *sna,
 				  CARD8 op,
 				  PicturePtr src, int16_t src_x, int16_t src_y,
-				  PicturePtr dst, int n, xTrapezoid *t,
+				  PicturePtr dst, int n, const xTrapezoid *t,
 				  bool force_fallback)
 {
 	if (!force_fallback &&
@@ -3800,7 +3803,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
 				   PicturePtr src,
 				   PicturePtr dst,
 				   INT16 src_x, INT16 src_y,
-				   int ntrap, xTrapezoid *traps,
+				   int ntrap, const xTrapezoid *traps,
 				   bool force_fallback)
 {
 	ScreenPtr screen = dst->pDrawable->pScreen;
@@ -3825,7 +3828,7 @@ composite_unaligned_boxes_fallback(struct sna *sna,
 	dx = dst->pDrawable->x;
 	dy = dst->pDrawable->y;
 	for (n = 0; n < ntrap; n++) {
-		xTrapezoid *t = &traps[n];
+		const xTrapezoid *t = &traps[n];
 		PixmapPtr scratch;
 		PicturePtr mask;
 		BoxRec extents;
@@ -3915,21 +3918,21 @@ composite_unaligned_boxes(struct sna *sna,
 			  PicturePtr dst,
 			  PictFormatPtr maskFormat,
 			  INT16 src_x, INT16 src_y,
-			  int ntrap, xTrapezoid *traps,
+			  int ntrap, const xTrapezoid *traps,
 			  bool force_fallback)
 {
 	BoxRec extents;
 	struct sna_composite_spans_op tmp;
 	struct sna_pixmap *priv;
 	pixman_region16_t clip, *c;
-	int dst_x, dst_y;
+	int16_t dst_x, dst_y;
 	int dx, dy, n;
 
 	if (NO_UNALIGNED_BOXES)
 		return false;
 
-	DBG(("%s: force_fallback=%d, mask=%x, n=%d\n",
-	     __FUNCTION__, force_fallback, maskFormat ? (int)maskFormat->format : 0, ntrap));
+	DBG(("%s: force_fallback=%d, mask=%x, n=%d, op=%d\n",
+	     __FUNCTION__, force_fallback, maskFormat ? (int)maskFormat->format : 0, ntrap, op));
 
 	/* need a span converter to handle overlapping traps */
 	if (ntrap > 1 && maskFormat)
@@ -3996,8 +3999,10 @@ fallback:
 
 	c = NULL;
 	if (extents.x2 - extents.x1 > clip.extents.x2 - clip.extents.x1 ||
-	    extents.y2 - extents.y1 > clip.extents.y2 - clip.extents.y1)
+	    extents.y2 - extents.y1 > clip.extents.y2 - clip.extents.y1) {
+		DBG(("%s: forcing clip\n", __FUNCTION__));
 		c = &clip;
+	}
 
 	extents = *RegionExtents(&clip);
 	dx = dst->pDrawable->x;
@@ -4016,18 +4021,23 @@ fallback:
 	case PictOpOver:
 		priv = sna_pixmap(get_drawable_pixmap(dst->pDrawable));
 		assert(priv != NULL);
-		if (priv->clear && priv->clear_color == 0)
+		if (priv->clear && priv->clear_color == 0) {
+			DBG(("%s: converting %d to PictOpSrc\n",
+			     __FUNCTION__, op));
 			op = PictOpSrc;
+		}
 		break;
 	case PictOpIn:
 		priv = sna_pixmap(get_drawable_pixmap(dst->pDrawable));
 		assert(priv != NULL);
-		if (priv->clear && priv->clear_color == 0)
+		if (priv->clear && priv->clear_color == 0) {
+			DBG(("%s: clear destination using In, skipping\n",
+			     __FUNCTION__));
 			return true;
+		}
 		break;
 	}
 
-	memset(&tmp, 0, sizeof(tmp));
 	if (!sna->render.composite_spans(sna, op, src, dst,
 					 src_x + extents.x1 - dst_x - dx,
 					 src_y + extents.y1 - dst_y - dy,
@@ -4035,7 +4045,7 @@ fallback:
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
 					 COMPOSITE_SPANS_RECTILINEAR,
-					 &tmp)) {
+					 memset(&tmp, 0, sizeof(tmp)))) {
 		DBG(("%s: composite spans render op not supported\n",
 		     __FUNCTION__));
 		REGION_UNINIT(NULL, &clip);
commit 5d62ec25937ad296114bf890a7a5ac11ff03508c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 9 13:44:24 2013 +0100

    sna/gen7: Add DBG for channel setup for render source
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index fd1cbd3..5cbed9d 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1953,6 +1953,25 @@ gen7_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) {
+		DBG(("%s: transform=[%f %f %f, %f %f %f, %f %f %f]\n",
+		     __FUNCTION__,
+		     channel->transform->matrix[0][0] / 65536.,
+		     channel->transform->matrix[0][1] / 65536.,
+		     channel->transform->matrix[0][2] / 65536.,
+		     channel->transform->matrix[1][0] / 65536.,
+		     channel->transform->matrix[1][1] / 65536.,
+		     channel->transform->matrix[1][2] / 65536.,
+		     channel->transform->matrix[2][0] / 65536.,
+		     channel->transform->matrix[2][1] / 65536.,
+		     channel->transform->matrix[2][2] / 65536.));
+	}
+
 	return sna_render_pixmap_bo(sna, channel, pixmap,
 				    x, y, w, h, dst_x, dst_y);
 }
commit debdcd6a09464251324238ccbd935a6ade265d94
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu May 9 13:43:57 2013 +0100

    sna: Add DBG statements for choice of spans vertex emitter
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_vertex.c b/src/sna/gen4_vertex.c
index cd366c9..a82f961 100644
--- a/src/sna/gen4_vertex.c
+++ b/src/sna/gen4_vertex.c
@@ -2923,11 +2923,13 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
 	unsigned vb;
 
 	if (tmp->base.src.is_solid) {
+		DBG(("%s: solid source\n", __FUNCTION__));
 		tmp->prim_emit = emit_span_solid;
 		tmp->emit_boxes = emit_span_boxes_solid;
 		tmp->base.floats_per_vertex = 3;
 		vb = 1 << 2 | 1;
 	} else if (tmp->base.src.is_linear) {
+		DBG(("%s: linear source\n", __FUNCTION__));
 #if defined(avx2)
 		if (sna->cpu_features & AVX2) {
 			tmp->prim_emit = emit_span_linear__avx2;
@@ -2947,6 +2949,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
 		tmp->base.floats_per_vertex = 3;
 		vb = 1 << 2 | 1;
 	} else if (tmp->base.src.transform == NULL) {
+		DBG(("%s: identity transform\n", __FUNCTION__));
 #if defined(avx2)
 		if (sna->cpu_features & AVX2) {
 			tmp->prim_emit = emit_span_identity__avx2;
@@ -2969,6 +2972,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
 		tmp->base.src.scale[0] /= tmp->base.src.transform->matrix[2][2];
 		tmp->base.src.scale[1] /= tmp->base.src.transform->matrix[2][2];
 		if (!sna_affine_transform_is_rotation(tmp->base.src.transform)) {
+			DBG(("%s: simple (unrotated affine) transform\n", __FUNCTION__));
 #if defined(avx2)
 			if (sna->cpu_features & AVX2) {
 				tmp->prim_emit = emit_span_simple__avx2;
@@ -2986,6 +2990,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
 				tmp->emit_boxes = emit_span_boxes_simple;
 			}
 		} else {
+			DBG(("%s: affine transform\n", __FUNCTION__));
 #if defined(avx2)
 			if (sna->cpu_features & AVX2) {
 				tmp->prim_emit = emit_span_affine__avx2;
@@ -3006,6 +3011,7 @@ unsigned gen4_choose_spans_emitter(struct sna *sna,
 		tmp->base.floats_per_vertex = 4;
 		vb = 1 << 2 | 2;
 	} else {
+		DBG(("%s: projective transform\n", __FUNCTION__));
 		tmp->prim_emit = emit_composite_spans_primitive;
 		tmp->base.floats_per_vertex = 5;
 		vb = 1 << 2 | 3;


More information about the xorg-commit mailing list