sna/traps: Micro-optimise span emission

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-03-16 12:59:13 +00:00
parent 3a26437f19
commit 47c47b85f6
1 changed files with 22 additions and 6 deletions

View File

@ -1140,6 +1140,18 @@ tor_blt_span(struct sna *sna,
apply_damage_box(&op->base, box);
}
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,
@ -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: