summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-03-16 12:59:13 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-03-16 12:59:13 +0000
commit47c47b85f6b7ef5cbc2192da9ef0cee91f6744ca (patch)
treeefd5ff9082d8cceeac40ed271f65818a285ceb09
parent3a26437f195bf3e5d5913f5552a0b838cafb9b2c (diff)
sna/traps: Micro-optimise span emission
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_trapezoids.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 4dab0f9f..52be00b9 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1141,6 +1141,18 @@ tor_blt_span(struct sna *sna,
}
static void
+tor_blt_span__no_damage(struct sna *sna,
+ struct sna_composite_spans_op *op,
+ pixman_region16_t *clip,
+ const BoxRec *box,
+ int coverage)
+{
+ __DBG(("%s: %d -> %d @ %d\n", __FUNCTION__, box->x1, box->x2, coverage));
+
+ op->box(sna, op, box, AREA_TO_ALPHA(coverage));
+}
+
+static void
tor_blt_span_clipped(struct sna *sna,
struct sna_composite_spans_op *op,
pixman_region16_t *clip,
@@ -3101,7 +3113,8 @@ project_trapezoid_onto_grid(const xTrapezoid *in,
}
static span_func_t
-choose_span(PicturePtr dst,
+choose_span(struct sna_composite_spans_op *tmp,
+ PicturePtr dst,
PictFormatPtr maskFormat,
uint8_t op,
RegionPtr clip)
@@ -3120,9 +3133,12 @@ choose_span(PicturePtr dst,
span = tor_blt_span_mono_clipped;
}
} else {
- span = tor_blt_span;
if (REGION_NUM_RECTS(clip) > 1)
span = tor_blt_span_clipped;
+ else if (tmp->base.damage == NULL)
+ span = tor_blt_span__no_damage;
+ else
+ span = tor_blt_span;
}
return span;
@@ -3379,7 +3395,7 @@ trapezoid_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
}
tor_render(sna, &tor, &tmp, &clip,
- choose_span(dst, maskFormat, op, &clip),
+ choose_span(&tmp, dst, maskFormat, op, &clip),
maskFormat && !operator_is_bounded(op));
skip:
@@ -4669,7 +4685,7 @@ trap_span_converter(PicturePtr dst,
}
tor_render(sna, &tor, &tmp, clip,
- choose_span(dst, NULL, PictOpAdd, clip), false);
+ choose_span(&tmp, dst, NULL, PictOpAdd, clip), false);
skip:
tor_fini(&tor);
@@ -5196,7 +5212,7 @@ triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
}
tor_render(sna, &tor, &tmp, &clip,
- choose_span(dst, maskFormat, op, &clip),
+ choose_span(&tmp, dst, maskFormat, op, &clip),
maskFormat && !operator_is_bounded(op));
skip:
@@ -5559,7 +5575,7 @@ tristrip_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
assert(tor.polygon->num_edges <= 2*count);
tor_render(sna, &tor, &tmp, &clip,
- choose_span(dst, maskFormat, op, &clip),
+ choose_span(&tmp, dst, maskFormat, op, &clip),
maskFormat && !operator_is_bounded(op));
skip: