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

Chris Wilson ickle at kemper.freedesktop.org
Tue Oct 11 02:59:58 PDT 2011


 src/sna/gen2_render.c    |   12 +++++-----
 src/sna/gen3_render.c    |   56 +++++++++++++++++++++++++++++++++++++----------
 src/sna/sna_render.h     |   20 ++++++++++------
 src/sna/sna_trapezoids.c |   11 +++++----
 4 files changed, 70 insertions(+), 29 deletions(-)

New commits:
commit a9b53c48774078d404149e86267c39eb82234c3a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Oct 11 10:37:25 2011 +0100

    sna: Mark the spans render functions as fastcall
    
    This reduces the amount of dancing required to call into the span
    functions as we can pass the arguments in both the integer and floating
    point registers.
    
    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 c0d357d..a7ace88 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1403,7 +1403,7 @@ cleanup_dst:
 	return FALSE;
 }
 
-static void
+fastcall static void
 gen2_emit_composite_spans_primitive_constant(struct sna *sna,
 					     const struct sna_composite_spans_op *op,
 					     const BoxRec *box,
@@ -1426,7 +1426,7 @@ gen2_emit_composite_spans_primitive_constant(struct sna *sna,
 	*((uint32_t *)v + 8) = alpha;
 }
 
-static void
+fastcall static void
 gen2_emit_composite_spans_primitive_identity_source(struct sna *sna,
 						    const struct sna_composite_spans_op *op,
 						    const BoxRec *box,
@@ -1455,7 +1455,7 @@ gen2_emit_composite_spans_primitive_identity_source(struct sna *sna,
 	v[14] = (op->base.src.offset[1] + box->y1) * op->base.src.scale[1];
 }
 
-static void
+fastcall static void
 gen2_emit_composite_spans_primitive_affine_source(struct sna *sna,
 						  const struct sna_composite_spans_op *op,
 						  const BoxRec *box,
@@ -1509,7 +1509,7 @@ gen2_emit_composite_spans_vertex(struct sna *sna,
 	gen2_emit_composite_texcoord(sna, &op->base.src, x, y);
 }
 
-static void
+fastcall static void
 gen2_emit_composite_spans_primitive(struct sna *sna,
 				    const struct sna_composite_spans_op *op,
 				    const BoxRec *box,
@@ -1588,7 +1588,7 @@ static void gen2_emit_composite_spans_state(struct sna *sna,
 	}
 }
 
-static void
+fastcall static void
 gen2_render_composite_spans_box(struct sna *sna,
 				const struct sna_composite_spans_op *op,
 				const BoxRec *box, float opacity)
@@ -1643,7 +1643,7 @@ gen2_render_composite_spans_boxes(struct sna *sna,
 	} while (nbox);
 }
 
-static void
+fastcall static void
 gen2_render_composite_spans_done(struct sna *sna,
 				 const struct sna_composite_spans_op *op)
 {
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index e25e71b..e7d8bb2 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2434,7 +2434,7 @@ gen3_emit_composite_spans_vertex(struct sna *sna,
 	OUT_VERTEX(opacity);
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_zero(struct sna *sna,
 					 const struct sna_composite_spans_op *op,
 					 const BoxRec *box,
@@ -2453,7 +2453,7 @@ gen3_emit_composite_spans_primitive_zero(struct sna *sna,
 	v[5] = op->base.dst.x + box->y1;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_zero_no_offset(struct sna *sna,
 						   const struct sna_composite_spans_op *op,
 						   const BoxRec *box,
@@ -2468,7 +2468,7 @@ gen3_emit_composite_spans_primitive_zero_no_offset(struct sna *sna,
 	v[5] = box->y1;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_constant(struct sna *sna,
 					     const struct sna_composite_spans_op *op,
 					     const BoxRec *box,
@@ -2484,7 +2484,7 @@ gen3_emit_composite_spans_primitive_constant(struct sna *sna,
 	v[8] = v[5] = v[2] = opacity;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_constant_no_offset(struct sna *sna,
 						       const struct sna_composite_spans_op *op,
 						       const BoxRec *box,
@@ -2500,7 +2500,7 @@ gen3_emit_composite_spans_primitive_constant_no_offset(struct sna *sna,
 	v[8] = v[5] = v[2] = opacity;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_identity_source(struct sna *sna,
 						    const struct sna_composite_spans_op *op,
 						    const BoxRec *box,
@@ -2528,7 +2528,7 @@ gen3_emit_composite_spans_primitive_identity_source(struct sna *sna,
 	v[14] = opacity;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_affine_source(struct sna *sna,
 						  const struct sna_composite_spans_op *op,
 						  const BoxRec *box,
@@ -2570,7 +2570,7 @@ gen3_emit_composite_spans_primitive_affine_source(struct sna *sna,
 	v[13] = y * op->base.src.scale[1];
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_identity_gradient(struct sna *sna,
 						      const struct sna_composite_spans_op *op,
 						      const BoxRec *box,
@@ -2598,7 +2598,7 @@ gen3_emit_composite_spans_primitive_identity_gradient(struct sna *sna,
 	v[14] = opacity;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive_affine_gradient(struct sna *sna,
 						    const struct sna_composite_spans_op *op,
 						    const BoxRec *box,
@@ -2633,7 +2633,7 @@ gen3_emit_composite_spans_primitive_affine_gradient(struct sna *sna,
 	v[14] = opacity;
 }
 
-static void
+fastcall static void
 gen3_emit_composite_spans_primitive(struct sna *sna,
 				    const struct sna_composite_spans_op *op,
 				    const BoxRec *box,
@@ -2650,7 +2650,7 @@ gen3_emit_composite_spans_primitive(struct sna *sna,
 					 opacity);
 }
 
-static void
+fastcall static void
 gen3_render_composite_spans_box(struct sna *sna,
 				const struct sna_composite_spans_op *op,
 				const BoxRec *box, float opacity)
@@ -2705,7 +2705,7 @@ gen3_render_composite_spans_boxes(struct sna *sna,
 	} while (nbox);
 }
 
-static void
+fastcall static void
 gen3_render_composite_spans_done(struct sna *sna,
 				 const struct sna_composite_spans_op *op)
 {
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 2cc39f0..9e658a8 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -137,17 +137,21 @@ struct sna_composite_op {
 struct sna_composite_spans_op {
 	struct sna_composite_op base;
 
-	void (*box)(struct sna *sna, const struct sna_composite_spans_op *op,
-		    const BoxRec *box, float opacity);
-	void (*boxes)(struct sna *sna, const struct sna_composite_spans_op *op,
+	fastcall void (*box)(struct sna *sna,
+			     const struct sna_composite_spans_op *op,
+			     const BoxRec *box,
+			     float opacity);
+	void (*boxes)(struct sna *sna,
+		      const struct sna_composite_spans_op *op,
 		      const BoxRec *box, int nbox,
 		      float opacity);
-	void (*done)(struct sna *sna, const struct sna_composite_spans_op *op);
+	fastcall void (*done)(struct sna *sna,
+			      const struct sna_composite_spans_op *op);
 
-	void (*prim_emit)(struct sna *sna,
-			  const struct sna_composite_spans_op *op,
-			  const BoxRec *box,
-			  float opacity);
+	fastcall void (*prim_emit)(struct sna *sna,
+				   const struct sna_composite_spans_op *op,
+				   const BoxRec *box,
+				   float opacity);
 };
 
 struct sna_fill_op {
commit 208fa8e6b88daf8446239a1a001a68ceb7d02e76
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Oct 11 10:08:42 2011 +0100

    sna/trapezoid: Perform the NULL check for damage in the caller
    
    Save the function call overhead in the common case.
    
    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 86593a9..b0331cb 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -110,13 +110,10 @@ static void apply_damage(struct sna_composite_op *op, RegionPtr region)
 	sna_damage_add(op->damage, region);
 }
 
-static void apply_damage_box(struct sna_composite_op *op, const BoxRec *box)
+static void _apply_damage_box(struct sna_composite_op *op, const BoxRec *box)
 {
 	BoxRec r;
 
-	if (op->damage == NULL)
-		return;
-
 	r.x1 = box->x1 + op->dst.x;
 	r.x2 = box->x2 + op->dst.x;
 	r.y1 = box->y1 + op->dst.y;
@@ -126,6 +123,12 @@ static void apply_damage_box(struct sna_composite_op *op, const BoxRec *box)
 	sna_damage_add_box(op->damage, &r);
 }
 
+inline static void apply_damage_box(struct sna_composite_op *op, const BoxRec *box)
+{
+	if (op->damage)
+		_apply_damage_box(op, box);
+}
+
 typedef int grid_scaled_x_t;
 typedef int grid_scaled_y_t;
 
commit 5050fead0ef81785a2a9be735852921463377e04
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Oct 11 09:59:13 2011 +0100

    sna/gen3: avoid applying zero offset to common spans
    
    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 dcaf0ff..e25e71b 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2454,6 +2454,21 @@ gen3_emit_composite_spans_primitive_zero(struct sna *sna,
 }
 
 static void
+gen3_emit_composite_spans_primitive_zero_no_offset(struct sna *sna,
+						   const struct sna_composite_spans_op *op,
+						   const BoxRec *box,
+						   float opacity)
+{
+	float *v = sna->render.vertex_data + sna->render.vertex_used;
+	sna->render.vertex_used += 6;
+
+	v[0] = box->x2;
+	v[3] = v[1] = box->y2;
+	v[4] = v[2] = box->x1;
+	v[5] = box->y1;
+}
+
+static void
 gen3_emit_composite_spans_primitive_constant(struct sna *sna,
 					     const struct sna_composite_spans_op *op,
 					     const BoxRec *box,
@@ -2470,6 +2485,22 @@ gen3_emit_composite_spans_primitive_constant(struct sna *sna,
 }
 
 static void
+gen3_emit_composite_spans_primitive_constant_no_offset(struct sna *sna,
+						       const struct sna_composite_spans_op *op,
+						       const BoxRec *box,
+						       float opacity)
+{
+	float *v = sna->render.vertex_data + sna->render.vertex_used;
+	sna->render.vertex_used += 9;
+
+	v[0] = box->x2;
+	v[6] = v[3] = box->x1;
+	v[4] = v[1] = box->y2;
+	v[7] = box->y1;
+	v[8] = v[5] = v[2] = opacity;
+}
+
+static void
 gen3_emit_composite_spans_primitive_identity_source(struct sna *sna,
 						    const struct sna_composite_spans_op *op,
 						    const BoxRec *box,
@@ -2698,6 +2729,8 @@ gen3_render_composite_spans(struct sna *sna,
 			    int16_t width,  int16_t height,
 			    struct sna_composite_spans_op *tmp)
 {
+	bool no_offset;
+
 	DBG(("%s(src=(%d, %d), dst=(%d, %d), size=(%d, %d))\n", __FUNCTION__,
 	     src_x, src_y, dst_x, dst_y, width, height));
 
@@ -2759,15 +2792,16 @@ gen3_render_composite_spans(struct sna *sna,
 	if (tmp->base.src.u.gen3.type != SHADER_ZERO)
 		tmp->base.mask.u.gen3.type = SHADER_OPACITY;
 
+	no_offset = tmp->base.dst.x == 0 && tmp->base.dst.y == 0;
 	tmp->prim_emit = gen3_emit_composite_spans_primitive;
 	switch (tmp->base.src.u.gen3.type) {
 	case SHADER_NONE:
 		assert(0);
 	case SHADER_ZERO:
-		tmp->prim_emit = gen3_emit_composite_spans_primitive_zero;
+		tmp->prim_emit = no_offset ? gen3_emit_composite_spans_primitive_zero_no_offset : gen3_emit_composite_spans_primitive_zero;
 		break;
 	case SHADER_CONSTANT:
-		tmp->prim_emit = gen3_emit_composite_spans_primitive_constant;
+		tmp->prim_emit = no_offset ? gen3_emit_composite_spans_primitive_constant_no_offset : gen3_emit_composite_spans_primitive_constant;
 		break;
 	case SHADER_LINEAR:
 	case SHADER_RADIAL:


More information about the xorg-commit mailing list