summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-04 20:13:07 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-04 20:13:07 +0000
commita8ed1a02ada1f8d2f910dfefb150d26c840bf9ea (patch)
tree4309528a7a3e4d25cd350e8361ad31cd10aacdba
parentb899a4b69696141ca8b897a7abf52649b09f7b3b (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.c17
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))