sna: Provide a fast path for miZeroLine for PolySegment

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-01-24 00:21:12 +00:00
parent e7817a2206
commit 7ac13a4d5a
1 changed files with 43 additions and 6 deletions

View File

@ -7044,6 +7044,7 @@ spans_fallback:
if (use_wide_spans(drawable, gc, &data.region.extents) &&
sna_drawable_use_gpu_bo(drawable, &data.region.extents, &data.damage)) {
void (*line)(DrawablePtr, GCPtr, int, int, DDXPointPtr);
uint32_t color;
int i;
DBG(("%s: converting segments into spans\n", __FUNCTION__));
@ -7066,14 +7067,50 @@ spans_fallback:
}
get_drawable_deltas(drawable, data.pixmap, &data.dx, &data.dy);
data.bo = priv->gpu_bo;
sna_gc(gc)->priv = &data;
gc->ops->FillSpans = sna_fill_spans__gpu;
for (i = 0; i < n; i++)
line(drawable, gc, CoordModeOrigin, 2,
(DDXPointPtr)&seg[i]);
if (gc->lineWidth == 0 &&
gc->lineStyle == LineSolid &&
gc_is_solid(gc, &color)) {
struct sna_fill_op fill;
if (!sna_fill_init_blt(&fill,
data.sna, data.pixmap,
priv->gpu_bo, gc->alu, color))
goto fallback;
data.op = &fill;
if ((data.flags & 2) == 0) {
if (data.dx | data.dy)
gc->ops->FillSpans = sna_fill_spans__fill_offset;
else
gc->ops->FillSpans = sna_fill_spans__fill;
} else {
region_maybe_clip(&data.region,
gc->pCompositeClip);
if (!RegionNotEmpty(&data.region))
return;
if (region_is_singular(&data.region))
gc->ops->FillSpans = sna_fill_spans__fill_clip_extents;
else
gc->ops->FillSpans = sna_fill_spans__fill_clip_boxes;
}
assert(gc->miTranslate);
for (i = 0; i < n; i++)
line(drawable, gc, CoordModeOrigin, 2,
(DDXPointPtr)&seg[i]);
fill.done(data.sna, &fill);
} else {
data.bo = priv->gpu_bo;
gc->ops->FillSpans = sna_fill_spans__gpu;
for (i = 0; i < n; i++)
line(drawable, gc, CoordModeOrigin, 2,
(DDXPointPtr)&seg[i]);
}
gc->ops->FillSpans = sna_fill_spans;
if (data.damage)