summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-24 00:21:12 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-24 01:29:31 +0000
commit7ac13a4d5aca1627b3a5fc9e7261d5dfafba970b (patch)
treec3314fbccfc2fb46792ec9d33066b6835901a8ea
parente7817a2206bd0b1cc4e4458686c328f7b41ea32c (diff)
sna: Provide a fast path for miZeroLine for PolySegment
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_accel.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index f2e810dd..291f5b24 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -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)