diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-24 00:21:12 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-24 01:29:31 +0000 |
commit | 5b8db54d0fa9eab2610feed6947e917f2e400e1a (patch) | |
tree | a2227cfb03236f6d7a0584e5596f336f83077a4c | |
parent | 280a9165db5382b93ab449158106bdd5aa7b2329 (diff) |
sna: Provide a fast path for miZeroLine for PolyLine
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 86 |
1 files changed, 60 insertions, 26 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index e4db541d..510f0172 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -6121,37 +6121,71 @@ spans_fallback: DBG(("%s: converting line into spans\n", __FUNCTION__)); get_drawable_deltas(drawable, data.pixmap, &data.dx, &data.dy); - - /* Note that the WideDash functions alternate between filling - * using fgPixel and bgPixel so we need to reset state between - * FillSpans. - */ - data.bo = priv->gpu_bo; sna_gc(gc)->priv = &data; - gc->ops->FillSpans = sna_fill_spans__gpu; - switch (gc->lineStyle) { - default: - assert(0); - case LineSolid: - if (gc->lineWidth == 0) { - DBG(("%s: miZeroLine\n", __FUNCTION__)); - miZeroLine(drawable, gc, mode, n, pt); + 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 { - DBG(("%s: miWideLine\n", __FUNCTION__)); - miWideLine(drawable, gc, mode, n, pt); + 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; } - break; - case LineOnOffDash: - case LineDoubleDash: - if (gc->lineWidth == 0) { - DBG(("%s: miZeroDashLine\n", __FUNCTION__)); - miZeroDashLine(drawable, gc, mode, n, pt); - } else { - DBG(("%s: miWideDash\n", __FUNCTION__)); - miWideDash(drawable, gc, mode, n, pt); + assert(gc->miTranslate); + + miZeroLine(drawable, gc, mode, n, pt); + fill.done(data.sna, &fill); + } else { + /* Note that the WideDash functions alternate between filling + * using fgPixel and bgPixel so we need to reset state between + * FillSpans. + */ + data.bo = priv->gpu_bo; + gc->ops->FillSpans = sna_fill_spans__gpu; + + switch (gc->lineStyle) { + default: + assert(0); + case LineSolid: + if (gc->lineWidth == 0) { + DBG(("%s: miZeroLine\n", __FUNCTION__)); + miZeroLine(drawable, gc, mode, n, pt); + } else { + DBG(("%s: miWideLine\n", __FUNCTION__)); + miWideLine(drawable, gc, mode, n, pt); + } + break; + case LineOnOffDash: + case LineDoubleDash: + if (gc->lineWidth == 0) { + DBG(("%s: miZeroDashLine\n", __FUNCTION__)); + miZeroDashLine(drawable, gc, mode, n, pt); + } else { + DBG(("%s: miWideDash\n", __FUNCTION__)); + miWideDash(drawable, gc, mode, n, pt); + } + break; } - break; } gc->ops->FillSpans = sna_fill_spans; |