diff options
author | Eric Anholt <eric@anholt.net> | 2014-01-09 11:36:30 +0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2014-03-17 14:30:57 -0700 |
commit | 923c8db7ed1adfe4689f0a36496262faca44b79d (patch) | |
tree | e1301a5998db44456bcc74d22e6499b7116adefd /glamor | |
parent | b6953045566dae15437d4220e68986db7a6b4ca7 (diff) |
glamor: Improve the performance of line fallbacks.
If the lines aren't solid-filled vert/horiz solid-filled rectangles,
we fall back. libreoffice has some diagonal lines, and the
performance of the fallback path was atrocious. Just fall back to
mi's spans instead, so that we don't do an upload/download.
Improves x11perf -seg100 by 863.652% +/- 9.8968% (n=5)
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'glamor')
-rw-r--r-- | glamor/glamor_polylines.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/glamor/glamor_polylines.c b/glamor/glamor_polylines.c index 697fc9e74..1adf45ddc 100644 --- a/glamor/glamor_polylines.c +++ b/glamor/glamor_polylines.c @@ -51,8 +51,9 @@ _glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n, /* This ends up in miSetSpans, which is accelerated as well as we * can hope X wide lines will be. */ - goto wide_line; + goto fail; } + if (gc->lineStyle != LineSolid) { glamor_fallback("non-solid fill line style %d\n", gc->lineStyle); goto fail; @@ -104,19 +105,19 @@ _glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n, && glamor_ddx_fallback_check_gc(gc)) return FALSE; - if (gc->lineWidth == 0) { - if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW) && - glamor_prepare_access_gc(gc)) { - fbPolyLine(drawable, gc, mode, n, points); - } - glamor_finish_access_gc(gc); - glamor_finish_access(drawable); - } - else { - wide_line: - /* fb calls mi functions in the lineWidth != 0 case. */ - fbPolyLine(drawable, gc, mode, n, points); + switch (gc->lineStyle) { + case LineSolid: + if (gc->lineWidth == 0) + miZeroLine(drawable, gc, mode, n, points); + else + miWideLine(drawable, gc, mode, n, points); + break; + case LineOnOffDash: + case LineDoubleDash: + miWideDash(drawable, gc, mode, n, points); + break; } + return TRUE; } |