diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-04 20:13:07 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-04 20:13:07 +0000 |
commit | a8ed1a02ada1f8d2f910dfefb150d26c840bf9ea (patch) | |
tree | 4309528a7a3e4d25cd350e8361ad31cd10aacdba | |
parent | b899a4b69696141ca8b897a7abf52649b09f7b3b (diff) |
sna: Discard the redundant clear of the unbounded area if already clear
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_trapezoids.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index c2a41907..28c8a677 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -2658,6 +2658,13 @@ choose_span(PicturePtr dst, } static bool +sna_drawable_is_clear(DrawablePtr d) +{ + struct sna_pixmap *priv = sna_pixmap(get_drawable_pixmap(d)); + return priv && priv->clear && priv->clear_color == 0; +} + +static bool mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, INT16 src_x, INT16 src_y, int ntrap, xTrapezoid *traps) @@ -2666,6 +2673,7 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, BoxRec extents; int16_t dst_x, dst_y; int16_t dx, dy; + bool was_clear; int n; if (NO_SCAN_CONVERTER) @@ -2709,6 +2717,8 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, if (!mono_init(&mono, 2*ntrap)) return false; + was_clear = sna_drawable_is_clear(dst->pDrawable); + for (n = 0; n < ntrap; n++) { if (!xTrapezoidValid(&traps[n])) continue; @@ -2741,7 +2751,7 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, mono.op.done(mono.sna, &mono.op); mono_fini(&mono); - if (!operator_is_bounded(op)) { + if (!was_clear && !operator_is_bounded(op)) { xPointFixed p1, p2; if (!mono_init(&mono, 2+2*ntrap)) @@ -4223,6 +4233,7 @@ mono_triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, BoxRec extents; int16_t dst_x, dst_y; int16_t dx, dy; + bool was_clear; int n; mono.sna = to_sna_from_drawable(dst->pDrawable); @@ -4261,6 +4272,8 @@ mono_triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, src_x + mono.clip.extents.x1 - dst_x - dx, src_y + mono.clip.extents.y1 - dst_y - dy)); + was_clear = sna_drawable_is_clear(dst->pDrawable); + if (mono_init(&mono, 3*count)) return false; @@ -4289,7 +4302,7 @@ mono_triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, mono.op.done(mono.sna, &mono.op); } - if (!operator_is_bounded(op)) { + if (!was_clear && !operator_is_bounded(op)) { xPointFixed p1, p2; if (!mono_init(&mono, 2+3*count)) |