xf86-video-intel: src/sna/gen3_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_render_inline.h

Chris Wilson ickle at kemper.freedesktop.org
Thu Sep 20 14:47:27 PDT 2012


 src/sna/gen3_render.c       |    8 ++------
 src/sna/gen5_render.c       |    8 ++------
 src/sna/gen6_render.c       |    8 ++------
 src/sna/gen7_render.c       |    8 ++------
 src/sna/sna_render_inline.h |   19 +++++++++++++++++++
 5 files changed, 27 insertions(+), 24 deletions(-)

New commits:
commit d853064e7eebc5719645c12605782f995131a6fe
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Sep 20 22:43:26 2012 +0100

    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 at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 723dd5e..4c4271e 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 c9a2cc0..a141766 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 8e10af3..4990062 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 51b002e..1f59eb3 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 64f8a46..216937a 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)


More information about the xorg-commit mailing list