diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-03 12:09:51 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-03 21:35:03 +0000 |
commit | 294c8791c435acf5933109fbcab85623a55b2c6c (patch) | |
tree | f92acb9315f0898e753142427833564ae717ffb5 | |
parent | 7ff42e9c83cdb17660a64901497704b38032af8c (diff) |
sna: Use a cheaper no-reduction damage check for simply discarding further damage
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 6 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 23 | ||||
-rw-r--r-- | src/sna/sna_damage.c | 17 | ||||
-rw-r--r-- | src/sna/sna_damage.h | 2 | ||||
-rw-r--r-- | src/sna/sna_render_inline.h | 2 |
5 files changed, 39 insertions, 11 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 0b9565c2..7a1dc466 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -1291,10 +1291,8 @@ _sna_drawable_use_cpu_bo(DrawablePtr drawable, return FALSE; done: - if (sna_damage_contains_box(priv->cpu_damage, - &extents) != PIXMAN_REGION_IN) - *damage = &priv->cpu_damage; - else + *damage = &priv->cpu_damage; + if (sna_damage_contains_box__no_reduce(priv->cpu_damage, &extents)) *damage = NULL; return TRUE; diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 220b900f..4c253768 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -1146,11 +1146,16 @@ has_gpu_area(PixmapPtr pixmap, int x, int y, int w, int h) if (priv->cpu_damage == NULL) return TRUE; + if (priv->cpu_damage->mode == DAMAGE_ALL) + return FALSE; area.x1 = x; area.y1 = y; area.x2 = x + w; area.y2 = y + h; + if (priv->gpu_damage && + sna_damage_contains_box__no_reduce(priv->gpu_damage, &area)) + return TRUE; return sna_damage_contains_box(priv->cpu_damage, &area) == PIXMAN_REGION_OUT; @@ -1164,16 +1169,19 @@ has_cpu_area(PixmapPtr pixmap, int x, int y, int w, int h) if (!priv) return TRUE; - if (!priv->gpu_bo) - return TRUE; - if (priv->gpu_damage == NULL) return TRUE; + if (priv->gpu_damage->mode == DAMAGE_ALL) + return FALSE; area.x1 = x; area.y1 = y; area.x2 = x + w; area.y2 = y + h; + if (priv->cpu_damage && + sna_damage_contains_box__no_reduce(priv->cpu_damage, &area)) + return TRUE; + return sna_damage_contains_box(priv->gpu_damage, &area) == PIXMAN_REGION_OUT; } @@ -1185,8 +1193,13 @@ reduce_damage(struct sna_composite_op *op, { BoxRec r; - if (op->damage == NULL) + if (op->damage == NULL || *op->damage == NULL) + return; + + if ((*op->damage)->mode == DAMAGE_ALL) { + op->damage = NULL; return; + } r.x1 = dst_x + op->dst.x; r.x2 = r.x1 + width; @@ -1194,7 +1207,7 @@ reduce_damage(struct sna_composite_op *op, r.y1 = dst_y + op->dst.y; r.y2 = r.y1 + height; - if (sna_damage_contains_box(*op->damage, &r) == PIXMAN_REGION_IN) + if (sna_damage_contains_box__no_reduce(*op->damage, &r)) op->damage = NULL; } diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c index 7431f39e..4cccbdcd 100644 --- a/src/sna/sna_damage.c +++ b/src/sna/sna_damage.c @@ -970,7 +970,7 @@ static bool box_contains(const BoxRec *a, const BoxRec *b) return true; } -static inline Bool sna_damage_maybe_contains_box(struct sna_damage *damage, +static inline Bool sna_damage_maybe_contains_box(const struct sna_damage *damage, const BoxRec *box) { if (box->x2 <= damage->extents.x1 || @@ -1190,6 +1190,21 @@ int sna_damage_contains_box(struct sna_damage *damage, } #endif +bool sna_damage_contains_box__no_reduce(const struct sna_damage *damage, + const BoxRec *box) +{ + int ret; + + assert(damage && damage->mode != DAMAGE_ALL); + if (!sna_damage_maybe_contains_box(damage, box)) + return false; + + ret = pixman_region_contains_rectangle((RegionPtr)&damage->region, + (BoxPtr)box); + return (!damage->dirty || damage->mode == DAMAGE_ADD) && + ret == PIXMAN_REGION_IN; +} + static Bool _sna_damage_intersect(struct sna_damage *damage, RegionPtr region, RegionPtr result) { diff --git a/src/sna/sna_damage.h b/src/sna/sna_damage.h index 8e0c73cc..abe222fe 100644 --- a/src/sna/sna_damage.h +++ b/src/sna/sna_damage.h @@ -124,6 +124,8 @@ Bool sna_damage_intersect(struct sna_damage *damage, int sna_damage_contains_box(struct sna_damage *damage, const BoxRec *box); +bool sna_damage_contains_box__no_reduce(const struct sna_damage *damage, + const BoxRec *box); int sna_damage_get_boxes(struct sna_damage *damage, BoxPtr *boxes); diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h index 06d1ba35..03691237 100644 --- a/src/sna/sna_render_inline.h +++ b/src/sna/sna_render_inline.h @@ -148,7 +148,7 @@ sna_render_reduce_damage(struct sna_composite_op *op, r.y1 = dst_y + op->dst.y; r.y2 = r.y1 + height; - if (sna_damage_contains_box(*op->damage, &r) == PIXMAN_REGION_IN) + if (sna_damage_contains_box__no_reduce(*op->damage, &r)) op->damage = NULL; } |