From b415ca05c2e1c4f09f85d8769d39e5369661ed3a Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 14 Jun 2012 17:06:19 +0100 Subject: [PATCH] sna: Reset damage extents after reduction goes to zero If the reduction of the damage clears all of the boxes, we need to reset the -infinite extents so that we continue to accumulate further damage. Reported-by: Zdenek Kabelac References: https://bugs.freedesktop.org/show_bug.cgi?id=50744 Signed-off-by: Chris Wilson --- src/sna/sna_damage.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c index 6149be7f..bdd6a5e8 100644 --- a/src/sna/sna_damage.c +++ b/src/sna/sna_damage.c @@ -164,6 +164,12 @@ reset_embedded_box(struct sna_damage *damage) list_init(&damage->embedded_box.list); } +static void reset_extents(struct sna_damage *damage) +{ + damage->extents.x1 = damage->extents.y1 = MAXSHORT; + damage->extents.x2 = damage->extents.y2 = MINSHORT; +} + static struct sna_damage *_sna_damage_create(void) { struct sna_damage *damage; @@ -179,8 +185,7 @@ static struct sna_damage *_sna_damage_create(void) reset_embedded_box(damage); damage->mode = DAMAGE_ADD; pixman_region_init(&damage->region); - damage->extents.x1 = damage->extents.y1 = MAXSHORT; - damage->extents.x2 = damage->extents.y2 = MINSHORT; + reset_extents(damage); return damage; } @@ -498,6 +503,7 @@ static void __sna_damage_reduce(struct sna_damage *damage) pixman_region_fini(region); pixman_region_init_rects(region, boxes, nboxes); + assert(!pixman_region_not_empty(region)); assert(damage->extents.x1 == region->extents.x1 && damage->extents.y1 == region->extents.y1 && damage->extents.x2 == region->extents.x2 && @@ -513,7 +519,10 @@ static void __sna_damage_reduce(struct sna_damage *damage) damage->extents.y1 <= region->extents.y1 && damage->extents.x2 >= region->extents.x2 && damage->extents.y2 >= region->extents.y2); - damage->extents = region->extents; + if (pixman_region_not_empty(region)) + damage->extents = region->extents; + else + reset_extents(damage); } free(free_boxes);