summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-03 12:09:51 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-03 21:35:03 +0000
commit294c8791c435acf5933109fbcab85623a55b2c6c (patch)
treef92acb9315f0898e753142427833564ae717ffb5
parent7ff42e9c83cdb17660a64901497704b38032af8c (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.c6
-rw-r--r--src/sna/sna_blt.c23
-rw-r--r--src/sna/sna_damage.c17
-rw-r--r--src/sna/sna_damage.h2
-rw-r--r--src/sna/sna_render_inline.h2
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;
}