xf86-video-intel: 3 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/kgem.c src/sna/sna_render.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Nov 4 06:54:33 PDT 2011


 src/sna/gen2_render.c    |    1 
 src/sna/gen3_render.c    |    1 
 src/sna/gen5_render.c    |  306 +++++++++++++++++++++++++++++++++++++++++++++++
 src/sna/gen6_render.c    |   10 +
 src/sna/kgem.c           |    2 
 src/sna/sna_render.h     |    2 
 src/sna/sna_trapezoids.c |    5 
 7 files changed, 323 insertions(+), 4 deletions(-)

New commits:
commit fc415ec3d3e982d89d7a25db8d5fd18e0412a99b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 4 13:53:17 2011 +0000

    sna/gen5: Also experiment with lazy spans here
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 7839d8e..3926adc 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -49,6 +49,8 @@
 #define DBG(x) ErrorF x
 #endif
 
+#define NO_COMPOSITE_SPANS 0
+
 #define DBG_NO_STATE_CACHE 0
 #define DBG_NO_SURFACE_CACHE 0
 
@@ -2072,6 +2074,307 @@ cleanup_dst:
 	return FALSE;
 }
 
+/* A poor man's span interface. But better than nothing? */
+#if !NO_COMPOSITE_SPANS
+static Bool
+gen5_composite_alpha_gradient_init(struct sna *sna,
+				   struct sna_composite_channel *channel)
+{
+	DBG(("%s\n", __FUNCTION__));
+
+	channel->filter = PictFilterNearest;
+	channel->repeat = RepeatPad;
+	channel->is_affine = TRUE;
+	channel->is_solid  = FALSE;
+	channel->transform = NULL;
+	channel->width  = 256;
+	channel->height = 1;
+	channel->card_format = GEN5_SURFACEFORMAT_B8G8R8A8_UNORM;
+
+	channel->bo = sna_render_get_alpha_gradient(sna);
+
+	channel->scale[0]  = channel->scale[1]  = 1;
+	channel->offset[0] = channel->offset[1] = 0;
+	return channel->bo != NULL;
+}
+
+inline static void
+gen5_emit_composite_texcoord(struct sna *sna,
+			     const struct sna_composite_channel *channel,
+			     int16_t x, int16_t y)
+{
+	float t[3];
+
+	if (channel->is_affine) {
+		sna_get_transformed_coordinates(x + channel->offset[0],
+						y + channel->offset[1],
+						channel->transform,
+						&t[0], &t[1]);
+		OUT_VERTEX_F(t[0] * channel->scale[0]);
+		OUT_VERTEX_F(t[1] * channel->scale[1]);
+	} else {
+		t[0] = t[1] = 0; t[2] = 1;
+		sna_get_transformed_coordinates_3d(x + channel->offset[0],
+						   y + channel->offset[1],
+						   channel->transform,
+						   &t[0], &t[1], &t[2]);
+		OUT_VERTEX_F(t[0] * channel->scale[0]);
+		OUT_VERTEX_F(t[1] * channel->scale[1]);
+		OUT_VERTEX_F(t[2]);
+	}
+}
+
+inline static void
+gen5_emit_composite_texcoord_affine(struct sna *sna,
+				    const struct sna_composite_channel *channel,
+				    int16_t x, int16_t y)
+{
+	float t[2];
+
+	sna_get_transformed_coordinates(x + channel->offset[0],
+					y + channel->offset[1],
+					channel->transform,
+					&t[0], &t[1]);
+	OUT_VERTEX_F(t[0] * channel->scale[0]);
+	OUT_VERTEX_F(t[1] * channel->scale[1]);
+}
+
+inline static void
+gen5_emit_composite_spans_vertex(struct sna *sna,
+				 const struct sna_composite_spans_op *op,
+				 int16_t x, int16_t y)
+{
+	OUT_VERTEX(x, y);
+	gen5_emit_composite_texcoord(sna, &op->base.src, x, y);
+}
+
+fastcall static void
+gen5_emit_composite_spans_primitive(struct sna *sna,
+				    const struct sna_composite_spans_op *op,
+				    const BoxRec *box,
+				    float opacity)
+{
+	gen5_emit_composite_spans_vertex(sna, op, box->x2, box->y2);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(1);
+	if (!op->base.is_affine)
+		OUT_VERTEX_F(1);
+
+	gen5_emit_composite_spans_vertex(sna, op, box->x1, box->y2);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(1);
+	if (!op->base.is_affine)
+		OUT_VERTEX_F(1);
+
+	gen5_emit_composite_spans_vertex(sna, op, box->x1, box->y1);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(0);
+	if (!op->base.is_affine)
+		OUT_VERTEX_F(1);
+}
+
+fastcall static void
+gen5_emit_composite_spans_solid(struct sna *sna,
+				const struct sna_composite_spans_op *op,
+				const BoxRec *box,
+				float opacity)
+{
+	OUT_VERTEX(box->x2, box->y2);
+	OUT_VERTEX_F(1); OUT_VERTEX_F(1);
+	OUT_VERTEX_F(opacity); OUT_VERTEX_F(1);
+
+	OUT_VERTEX(box->x1, box->y2);
+	OUT_VERTEX_F(0); OUT_VERTEX_F(1);
+	OUT_VERTEX_F(opacity); OUT_VERTEX_F(1);
+
+	OUT_VERTEX(box->x1, box->y1);
+	OUT_VERTEX_F(0); OUT_VERTEX_F(0);
+	OUT_VERTEX_F(opacity); OUT_VERTEX_F(0);
+}
+
+fastcall static void
+gen5_emit_composite_spans_affine(struct sna *sna,
+				 const struct sna_composite_spans_op *op,
+				 const BoxRec *box,
+				 float opacity)
+{
+	OUT_VERTEX(box->x2, box->y2);
+	gen5_emit_composite_texcoord_affine(sna, &op->base.src,
+					    box->x2, box->y2);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(1);
+
+	OUT_VERTEX(box->x1, box->y2);
+	gen5_emit_composite_texcoord_affine(sna, &op->base.src,
+					    box->x1, box->y2);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(1);
+
+	OUT_VERTEX(box->x1, box->y1);
+	gen5_emit_composite_texcoord_affine(sna, &op->base.src,
+					    box->x1, box->y1);
+	OUT_VERTEX_F(opacity);
+	OUT_VERTEX_F(0);
+}
+
+fastcall static void
+gen5_render_composite_spans_box(struct sna *sna,
+				const struct sna_composite_spans_op *op,
+				const BoxRec *box, float opacity)
+{
+	DBG(("%s: src=+(%d, %d), opacity=%f, dst=+(%d, %d), box=(%d, %d) x (%d, %d)\n",
+	     __FUNCTION__,
+	     op->base.src.offset[0], op->base.src.offset[1],
+	     opacity,
+	     op->base.dst.x, op->base.dst.y,
+	     box->x1, box->y1,
+	     box->x2 - box->x1,
+	     box->y2 - box->y1));
+
+	if (gen5_get_rectangles(sna, &op->base, 1) == 0) {
+		gen5_bind_surfaces(sna, &op->base);
+		gen5_get_rectangles(sna, &op->base, 1);
+	}
+
+	op->prim_emit(sna, op, box, opacity);
+}
+
+static void
+gen5_render_composite_spans_boxes(struct sna *sna,
+				  const struct sna_composite_spans_op *op,
+				  const BoxRec *box, int nbox,
+				  float opacity)
+{
+	DBG(("%s: nbox=%d, src=+(%d, %d), opacity=%f, dst=+(%d, %d)\n",
+	     __FUNCTION__, nbox,
+	     op->base.src.offset[0], op->base.src.offset[1],
+	     opacity,
+	     op->base.dst.x, op->base.dst.y));
+
+	do {
+		int nbox_this_time;
+
+		nbox_this_time = gen5_get_rectangles(sna, &op->base, nbox);
+		if (nbox_this_time == 0) {
+			gen5_bind_surfaces(sna, &op->base);
+			nbox_this_time = gen5_get_rectangles(sna, &op->base, nbox);
+		}
+		nbox -= nbox_this_time;
+
+		do {
+			DBG(("  %s: (%d, %d) x (%d, %d)\n", __FUNCTION__,
+			     box->x1, box->y1,
+			     box->x2 - box->x1,
+			     box->y2 - box->y1));
+
+			op->prim_emit(sna, op, box++, opacity);
+		} while (--nbox_this_time);
+	} while (nbox);
+}
+
+fastcall static void
+gen5_render_composite_spans_done(struct sna *sna,
+				 const struct sna_composite_spans_op *op)
+{
+	gen5_vertex_flush(sna);
+	_kgem_set_mode(&sna->kgem, KGEM_RENDER);
+
+	DBG(("%s()\n", __FUNCTION__));
+
+	sna_render_composite_redirect_done(sna, &op->base);
+	if (op->base.src.bo)
+		kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+}
+
+static Bool
+gen5_render_composite_spans(struct sna *sna,
+			    uint8_t op,
+			    PicturePtr src,
+			    PicturePtr dst,
+			    int16_t src_x,  int16_t src_y,
+			    int16_t dst_x,  int16_t dst_y,
+			    int16_t width,  int16_t height,
+			    unsigned flags,
+			    struct sna_composite_spans_op *tmp)
+{
+	DBG(("%s: %dx%d with flags=%x, current mode=%d\n", __FUNCTION__,
+	     width, height, flags, sna->kgem.ring));
+
+	if ((flags & COMPOSITE_SPANS_RECTILINEAR) == 0)
+		return FALSE;
+
+	if (op >= ARRAY_SIZE(gen5_blend_op))
+		return FALSE;
+
+	if (need_tiling(sna, width, height))
+		return FALSE;
+
+	tmp->base.op = op;
+	if (!gen5_composite_set_target(dst, &tmp->base))
+		return FALSE;
+
+	if (tmp->base.dst.width > 8192 || tmp->base.dst.height > 8192) {
+		if (!sna_render_composite_redirect(sna, &tmp->base,
+						   dst_x, dst_y, width, height))
+			return FALSE;
+	}
+
+	switch (gen5_composite_picture(sna, src, &tmp->base.src,
+				       src_x, src_y,
+				       width, height,
+				       dst_x, dst_y)) {
+	case -1:
+		goto cleanup_dst;
+	case 0:
+		gen5_composite_solid_init(sna, &tmp->base.src, 0);
+	case 1:
+		gen5_composite_channel_convert(&tmp->base.src);
+		break;
+	}
+
+	tmp->base.is_affine = tmp->base.src.is_affine;
+	tmp->base.has_component_alpha = FALSE;
+	tmp->base.need_magic_ca_pass = FALSE;
+
+	gen5_composite_alpha_gradient_init(sna, &tmp->base.mask);
+
+	tmp->prim_emit = gen5_emit_composite_spans_primitive;
+	if (tmp->base.src.is_solid)
+		tmp->prim_emit = gen5_emit_composite_spans_solid;
+	else if (tmp->base.is_affine)
+		tmp->prim_emit = gen5_emit_composite_spans_affine;
+	tmp->base.floats_per_vertex = 5 + 2*!tmp->base.is_affine;
+	tmp->base.floats_per_rect = 3 * tmp->base.floats_per_vertex;
+
+	tmp->base.u.gen5.wm_kernel =
+		gen5_choose_composite_kernel(tmp->base.op,
+					     TRUE, FALSE,
+					     tmp->base.is_affine);
+	tmp->base.u.gen5.ve_id = 1 << 1 | tmp->base.is_affine;
+
+	tmp->box   = gen5_render_composite_spans_box;
+	tmp->boxes = gen5_render_composite_spans_boxes;
+	tmp->done  = gen5_render_composite_spans_done;
+
+	if (!kgem_check_bo(&sna->kgem,
+			   tmp->base.dst.bo, tmp->base.src.bo,
+			   NULL))
+		kgem_submit(&sna->kgem);
+
+	if (kgem_bo_is_dirty(tmp->base.src.bo))
+		kgem_emit_flush(&sna->kgem);
+
+	gen5_bind_surfaces(sna, &tmp->base);
+	gen5_align_vertex(sna, &tmp->base);
+	return TRUE;
+
+cleanup_dst:
+	if (tmp->base.redirect.real_bo)
+		kgem_bo_destroy(&sna->kgem, tmp->base.dst.bo);
+	return FALSE;
+}
+#endif
+
 static void
 gen5_copy_bind_surfaces(struct sna *sna,
 			const struct sna_composite_op *op)
@@ -3015,6 +3318,9 @@ Bool gen5_render_init(struct sna *sna)
 	sna->kgem.context_switch = gen5_render_context_switch;
 
 	sna->render.composite = gen5_render_composite;
+#if !NO_COMPOSITE_SPANS
+	sna->render.composite_spans = gen5_render_composite_spans;
+#endif
 	sna->render.video = gen5_render_video;
 
 	sna->render.copy_boxes = gen5_render_copy_boxes;
commit 567cfa508f788b4dd5de9aafbe2f148bb6a8dbc6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 4 13:43:03 2011 +0000

    sna/gen6: Enable spans interface for boxes
    
    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 2577493..8908ae2 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1684,6 +1684,7 @@ gen2_render_composite_spans(struct sna *sna,
 			    int16_t src_x,  int16_t src_y,
 			    int16_t dst_x,  int16_t dst_y,
 			    int16_t width,  int16_t height,
+			    unsigned flags,
 			    struct sna_composite_spans_op *tmp)
 {
 	DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 7f68b00..c326364 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2810,6 +2810,7 @@ gen3_render_composite_spans(struct sna *sna,
 			    int16_t src_x,  int16_t src_y,
 			    int16_t dst_x,  int16_t dst_y,
 			    int16_t width,  int16_t height,
+			    unsigned flags,
 			    struct sna_composite_spans_op *tmp)
 {
 	bool no_offset;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 99655b8..7cb8e71 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -50,7 +50,7 @@
 #endif
 
 #define NO_COMPOSITE 0
-#define NO_COMPOSITE_SPANS 1
+#define NO_COMPOSITE_SPANS 0
 #define NO_COPY 0
 #define NO_COPY_BOXES 0
 #define NO_FILL 0
@@ -2465,10 +2465,14 @@ gen6_render_composite_spans(struct sna *sna,
 			    int16_t src_x,  int16_t src_y,
 			    int16_t dst_x,  int16_t dst_y,
 			    int16_t width,  int16_t height,
+			    unsigned flags,
 			    struct sna_composite_spans_op *tmp)
 {
-	DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__,
-	     width, height, sna->kgem.ring));
+	DBG(("%s: %dx%d with flags=%x, current mode=%d\n", __FUNCTION__,
+	     width, height, flags, sna->kgem.ring));
+
+	if ((flags & COMPOSITE_SPANS_RECTILINEAR) == 0)
+		return FALSE;
 
 	if (op >= ARRAY_SIZE(gen6_blend_op))
 		return FALSE;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 774c576..95720fa 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -193,7 +193,9 @@ struct sna_render {
 				int16_t src_x, int16_t src_y,
 				int16_t dst_x, int16_t dst_y,
 				int16_t w, int16_t h,
+				unsigned flags,
 				struct sna_composite_spans_op *tmp);
+#define COMPOSITE_SPANS_RECTILINEAR 0x1
 
 	Bool (*video)(struct sna *sna,
 		      struct sna_video *video,
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index a6b8562..573841e 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2494,6 +2494,7 @@ composite_unaligned_boxes(CARD8 op,
 					 extents.x1,  extents.y1,
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
+					 COMPOSITE_SPANS_RECTILINEAR,
 					 &tmp)) {
 		DBG(("%s: composite spans render op not supported\n",
 		     __FUNCTION__));
@@ -2790,6 +2791,7 @@ trapezoid_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 					 extents.x1,  extents.y1,
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
+					 0,
 					 &tmp)) {
 		DBG(("%s: fallback -- composite spans render op not supported\n",
 		     __FUNCTION__));
@@ -3237,6 +3239,7 @@ trap_span_converter(PicturePtr dst,
 					 extents.x1,  extents.y1,
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
+					 0,
 					 &tmp)) {
 		DBG(("%s: fallback -- composite spans render op not supported\n",
 		     __FUNCTION__));
@@ -3773,6 +3776,7 @@ triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 					 extents.x1,  extents.y1,
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
+					 0,
 					 &tmp)) {
 		DBG(("%s: fallback -- composite spans render op not supported\n",
 		     __FUNCTION__));
@@ -4123,6 +4127,7 @@ tristrip_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 					 extents.x1,  extents.y1,
 					 extents.x2 - extents.x1,
 					 extents.y2 - extents.y1,
+					 0,
 					 &tmp)) {
 		DBG(("%s: fallback -- composite spans render op not supported\n",
 		     __FUNCTION__));
commit 465515a1446fd05fdc4691522803c94515187b4c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Nov 4 13:40:13 2011 +0000

    sna: Silly compile fix, escaped when testing uxa
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 310f8b5..b0e76b7 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -512,7 +512,7 @@ void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo)
 
 	list_move(&bo->request, &kgem->next_request->buffers);
 
-	/* XXX is it worth working around gcc here?
+	/* XXX is it worth working around gcc here? */
 	kgem->flush |= bo->flush;
 	kgem->sync |= bo->sync;
 }


More information about the xorg-commit mailing list