summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-09-20 22:43:26 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-09-20 22:43:26 +0100
commitd853064e7eebc5719645c12605782f995131a6fe (patch)
tree1fc06ab74c8139f55fbc67fc89bb45b068fc77bb
parent853beff4306d5a168e310af82d0ddf9db319fdce (diff)
sna/gen3+: Trim the target extents to the CompositeClip
When computing the active region with of a composite operation with unknown extents we try to simply use the whole Drawable. However, this needs to be clipped otherwise it may trigger assertion failure with an offscreen pixmap. References: https://bugs.freedesktop.org/show_bug.cgi?id=55164 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen3_render.c8
-rw-r--r--src/sna/gen5_render.c8
-rw-r--r--src/sna/gen6_render.c8
-rw-r--r--src/sna/gen7_render.c8
-rw-r--r--src/sna/sna_render_inline.h19
5 files changed, 27 insertions, 24 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 723dd5ee..4c4271e7 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2500,12 +2500,8 @@ gen3_composite_set_target(struct sna *sna,
box.y1 = y;
box.x2 = x + w;
box.y2 = y + h;
- } else {
- box.x1 = dst->pDrawable->x;
- box.y1 = dst->pDrawable->y;
- box.x2 = box.x1 + dst->pDrawable->width;
- box.y2 = box.y1 + dst->pDrawable->height;
- }
+ } else
+ sna_render_picture_extents(dst, &box);
op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
PREFER_GPU | FORCE_GPU | RENDER_GPU,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index c9a2cc04..a1417664 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1983,12 +1983,8 @@ gen5_composite_set_target(struct sna *sna,
box.y1 = y;
box.x2 = x + w;
box.y2 = y + h;
- } else {
- box.x1 = dst->pDrawable->x;
- box.y1 = dst->pDrawable->y;
- box.x2 = box.x1 + dst->pDrawable->width;
- box.y2 = box.y1 + dst->pDrawable->height;
- }
+ } else
+ sna_render_picture_extents(dst, &box);
op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
PREFER_GPU | FORCE_GPU | RENDER_GPU,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 8e10af34..4990062f 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2331,12 +2331,8 @@ gen6_composite_set_target(struct sna *sna,
box.y1 = y;
box.x2 = x + w;
box.y2 = y + h;
- } else {
- box.x1 = dst->pDrawable->x;
- box.y1 = dst->pDrawable->y;
- box.x2 = box.x1 + dst->pDrawable->width;
- box.y2 = box.y1 + dst->pDrawable->height;
- }
+ } else
+ sna_render_picture_extents(dst, &box);
op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
PREFER_GPU | FORCE_GPU | RENDER_GPU,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 51b002e0..1f59eb37 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2438,12 +2438,8 @@ gen7_composite_set_target(struct sna *sna,
box.y1 = y;
box.x2 = x + w;
box.y2 = y + h;
- } else {
- box.x1 = dst->pDrawable->x;
- box.y1 = dst->pDrawable->y;
- box.x2 = box.x1 + dst->pDrawable->width;
- box.y2 = box.y1 + dst->pDrawable->height;
- }
+ } else
+ sna_render_picture_extents(dst, &box);
op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
PREFER_GPU | FORCE_GPU | RENDER_GPU,
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 64f8a46f..216937a2 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -140,6 +140,25 @@ sna_render_get_alpha_gradient(struct sna *sna)
}
static inline void
+sna_render_picture_extents(PicturePtr p, BoxRec *box)
+{
+ box->x1 = p->pDrawable->x;
+ box->y1 = p->pDrawable->y;
+ box->x2 = p->pDrawable->x + p->pDrawable->width;
+ box->y2 = p->pDrawable->y + p->pDrawable->height;
+
+ if (box->x1 < p->pCompositeClip->extents.x1)
+ box->x1 = p->pCompositeClip->extents.x1;
+ if (box->y1 < p->pCompositeClip->extents.y1)
+ box->y1 = p->pCompositeClip->extents.y1;
+
+ if (box->x2 > p->pCompositeClip->extents.x2)
+ box->x2 = p->pCompositeClip->extents.x2;
+ if (box->y2 > p->pCompositeClip->extents.y2)
+ box->y2 = p->pCompositeClip->extents.y2;
+}
+
+static inline void
sna_render_reduce_damage(struct sna_composite_op *op,
int dst_x, int dst_y,
int width, int height)