xf86-video-intel: 5 commits - src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna.h src/sna/sna_io.c src/sna/sna_render.c src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Jan 6 03:10:20 PST 2012


 src/sna/sna.h            |    4 -
 src/sna/sna_accel.c      |   26 +++++-------
 src/sna/sna_blt.c        |   10 +---
 src/sna/sna_io.c         |   35 +++++++++-------
 src/sna/sna_render.c     |   35 ++++++++++------
 src/sna/sna_trapezoids.c |   97 ++++++++++++++++++++++++++++++++++++++++++-----
 6 files changed, 146 insertions(+), 61 deletions(-)

New commits:
commit 07f1724ba5759772043fc4c5d1163ddd640004c2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 6 11:00:38 2012 +0000

    sna: Pass the real destination pixmap to sna_write_boxes()
    
    Faking it for the render upload simply isn't good enough, since we need
    the correct drawrect.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index a1737c1..f16324e 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -681,9 +681,9 @@ void sna_read_boxes(struct sna *sna,
 		    struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
 		    PixmapPtr dst, int16_t dst_dx, int16_t dst_dy,
 		    const BoxRec *box, int n);
-void sna_write_boxes(struct sna *sna,
+void sna_write_boxes(struct sna *sna, PixmapPtr dst,
 		     struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
-		     const void *src, int stride, int bpp, int16_t src_dx, int16_t src_dy,
+		     const void *src, int stride, int16_t src_dx, int16_t src_dy,
 		     const BoxRec *box, int n);
 
 struct kgem_bo *sna_replace(struct sna *sna,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index afae205..06826d2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1214,11 +1214,10 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 						    pixmap->devPrivate.ptr,
 						    pixmap->devKind);
 			} else {
-				sna_write_boxes(sna,
+				sna_write_boxes(sna, pixmap,
 						priv->gpu_bo, 0, 0,
 						pixmap->devPrivate.ptr,
 						pixmap->devKind,
-						pixmap->drawable.bitsPerPixel,
 						0, 0,
 						box, n);
 			}
@@ -1581,11 +1580,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 						    pixmap->devPrivate.ptr,
 						    pixmap->devKind);
 			} else {
-				sna_write_boxes(sna,
+				sna_write_boxes(sna, pixmap,
 						priv->gpu_bo, 0, 0,
 						pixmap->devPrivate.ptr,
 						pixmap->devKind,
-						pixmap->drawable.bitsPerPixel,
 						0, 0,
 						box, n);
 			}
@@ -1847,11 +1845,10 @@ sna_put_image_upload_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	}
 
 	if (!ok && gc->alu == GXcopy) {
-		sna_write_boxes(sna,
+		sna_write_boxes(sna, pixmap,
 				priv->gpu_bo, 0, 0,
 				bits,
 				stride,
-				pixmap->drawable.bitsPerPixel,
 				-x, -y,
 				box, nbox);
 		ok = TRUE;
@@ -2774,11 +2771,10 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 			} else {
 				DBG(("%s: dst is on the GPU, src is on the CPU, uploading\n",
 				     __FUNCTION__));
-				sna_write_boxes(sna,
+				sna_write_boxes(sna, dst_pixmap,
 						dst_priv->gpu_bo, dst_dx, dst_dy,
 						src_pixmap->devPrivate.ptr,
 						src_pixmap->devKind,
-						src_pixmap->drawable.bitsPerPixel,
 						src_dx, src_dy,
 						box, n);
 
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 4c25376..5879e97 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1006,9 +1006,9 @@ blt_put_composite(struct sna *sna,
 		box.x2 = dst_x + r->width;
 		box.y2 = dst_y + r->height;
 
-		sna_write_boxes(sna,
+		sna_write_boxes(sna, dst,
 				dst_priv->gpu_bo, 0, 0,
-				data, pitch, bpp, src_x, src_y,
+				data, pitch, src_x, src_y,
 				&box, 1);
 	}
 }
@@ -1038,11 +1038,10 @@ fastcall static void blt_put_composite_box(struct sna *sna,
 			sna_replace(sna, op->dst.pixmap, op->dst.bo,
 				    data, pitch);
 	} else {
-		sna_write_boxes(sna,
+		sna_write_boxes(sna, op->dst.pixmap,
 				op->dst.bo, op->dst.x, op->dst.y,
 				src->devPrivate.ptr,
 				src->devKind,
-				src->drawable.bitsPerPixel,
 				op->u.blt.sx, op->u.blt.sy,
 				box, 1);
 	}
@@ -1074,11 +1073,10 @@ static void blt_put_composite_boxes(struct sna *sna,
 			sna_replace(sna, op->dst.pixmap, op->dst.bo,
 				    data, pitch);
 	} else {
-		sna_write_boxes(sna,
+		sna_write_boxes(sna, op->dst.pixmap,
 				op->dst.bo, op->dst.x, op->dst.y,
 				src->devPrivate.ptr,
 				src->devKind,
-				src->drawable.bitsPerPixel,
 				op->u.blt.sx, op->u.blt.sy,
 				box, n);
 	}
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 1c25b9d..c5e66f1 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -305,9 +305,9 @@ static void write_boxes_inplace(struct kgem *kgem,
 	} while (--n);
 }
 
-void sna_write_boxes(struct sna *sna,
+void sna_write_boxes(struct sna *sna, PixmapPtr dst,
 		     struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
-		     const void *src, int stride, int bpp, int16_t src_dx, int16_t src_dy,
+		     const void *src, int stride, int16_t src_dx, int16_t src_dy,
 		     const BoxRec *box, int nbox)
 {
 	struct kgem *kgem = &sna->kgem;
@@ -322,7 +322,7 @@ void sna_write_boxes(struct sna *sna,
 	    !kgem_bo_map_will_stall(kgem, dst_bo)) {
 fallback:
 		write_boxes_inplace(kgem,
-				    src, stride, bpp, src_dx, src_dy,
+				    src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy,
 				    dst_bo, dst_dx, dst_dy,
 				    box, nbox);
 		return;
@@ -348,11 +348,14 @@ fallback:
 
 		tmp.drawable.width = extents.x2 - extents.x1;
 		tmp.drawable.height = extents.y2 - extents.y1;
-		tmp.drawable.depth = bpp;
-		tmp.drawable.bitsPerPixel = bpp;
+		tmp.drawable.depth = dst->drawable.depth;
+		tmp.drawable.bitsPerPixel = dst->drawable.bitsPerPixel;
 		tmp.devPrivate.ptr = NULL;
 
-		tmp.devKind = tmp.drawable.width * bpp / 8;
+		assert(tmp.drawable.width);
+		assert(tmp.drawable.height);
+
+		tmp.devKind = tmp.drawable.width * tmp.drawable.bitsPerPixel / 8;
 		tmp.devKind = ALIGN(tmp.devKind, 4);
 
 		src_bo = kgem_create_buffer(kgem,
@@ -365,7 +368,7 @@ fallback:
 		src_bo->pitch = tmp.devKind;
 
 		for (n = 0; n < nbox; n++) {
-			memcpy_blt(src, ptr, bpp,
+			memcpy_blt(src, ptr, tmp.drawable.bitsPerPixel,
 				   stride, tmp.devKind,
 				   box[n].x1 + src_dx,
 				   box[n].y1 + src_dy,
@@ -377,7 +380,7 @@ fallback:
 
 		n = sna->render.copy_boxes(sna, GXcopy,
 					   &tmp, src_bo, -extents.x1, -extents.y1,
-					   &tmp, dst_bo, dst_dx, dst_dy,
+					   dst, dst_bo, dst_dx, dst_dy,
 					   box, nbox);
 
 		kgem_bo_destroy(&sna->kgem, src_bo);
@@ -389,17 +392,16 @@ fallback:
 	}
 
 	cmd = XY_SRC_COPY_BLT_CMD;
-	if (bpp == 32)
-		cmd |= BLT_WRITE_ALPHA | BLT_WRITE_RGB;
 	br13 = dst_bo->pitch;
 	if (kgem->gen >= 40 && dst_bo->tiling) {
 		cmd |= BLT_DST_TILED;
 		br13 >>= 2;
 	}
 	br13 |= 0xcc << 16;
-	switch (bpp) {
+	switch (dst->drawable.bitsPerPixel) {
 	default:
-	case 32: br13 |= 1 << 25; /* RGB8888 */
+	case 32: cmd |= BLT_WRITE_ALPHA | BLT_WRITE_RGB;
+		 br13 |= 1 << 25; /* RGB8888 */
 	case 16: br13 |= 1 << 24; /* RGB565 */
 	case 8: break;
 	}
@@ -431,7 +433,7 @@ fallback:
 		for (n = 0; n < nbox_this_time; n++) {
 			int height = box[n].y2 - box[n].y1;
 			int width = box[n].x2 - box[n].x1;
-			offset += PITCH(width, bpp >> 3) * height;
+			offset += PITCH(width, dst->drawable.bitsPerPixel >> 3) * height;
 		}
 
 		src_bo = kgem_create_buffer(kgem, offset,
@@ -444,7 +446,7 @@ fallback:
 		do {
 			int height = box->y2 - box->y1;
 			int width = box->x2 - box->x1;
-			int pitch = PITCH(width, bpp >> 3);
+			int pitch = PITCH(width, dst->drawable.bitsPerPixel >> 3);
 			uint32_t *b;
 
 			DBG(("  %s: box src=(%d, %d), dst=(%d, %d) size=(%d, %d), dst offset=%d, dst pitch=%d\n",
@@ -455,13 +457,14 @@ fallback:
 			     offset, pitch));
 
 			assert(box->x1 + src_dx >= 0);
-			assert((box->x2 + src_dx)*bpp <= 8*stride);
+			assert((box->x2 + src_dx)*dst->drawable.bitsPerPixel <= 8*stride);
 			assert(box->y1 + src_dy >= 0);
 
 			assert(box->x1 + dst_dx >= 0);
 			assert(box->y1 + dst_dy >= 0);
 
-			memcpy_blt(src, (char *)ptr + offset, bpp,
+			memcpy_blt(src, (char *)ptr + offset,
+				   dst->drawable.bitsPerPixel,
 				   stride, pitch,
 				   box->x1 + src_dx, box->y1 + src_dy,
 				   0, 0,
commit 5c2e9a98715eeddd8dfdff9fe3871bde659484cc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 6 02:26:39 2012 +0000

    sna/trapezoids: Use a slightly faster miTrapezoidBounds()
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 42cebb9..903bc42 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1872,6 +1872,88 @@ static int operator_is_bounded(uint8_t op)
 	}
 }
 
+inline static xFixed
+line_x_for_y(const xLineFixed *l, xFixed y, bool ceil)
+{
+	xFixed_32_32 ex = (xFixed_32_32)(y - l->p1.y) * (l->p2.x - l->p1.x);
+	xFixed d = l->p2.y - l->p1.y;
+
+	if (ceil)
+		ex += (d - 1);
+
+	return l->p1.x + (xFixed) (ex / d);
+}
+
+#define pixman_fixed_integer_floor(V) pixman_fixed_to_int(V)
+#define pixman_fixed_integer_ceil(V) pixman_fixed_to_int(pixman_fixed_ceil(V))
+
+static void
+trapezoids_bounds(int n, const xTrapezoid *t, BoxPtr box)
+{
+	xFixed x1, y1, x2, y2;
+
+	/* XXX need 33 bits... */
+	x1 = y1 = INT_MAX / 2;
+	x2 = y2 = INT_MIN / 2;
+
+	do {
+		xFixed fx1, fx2, v;
+
+		if (!xTrapezoidValid(t))
+			continue;
+
+		if (t->top < y1)
+			y1 = t->top;
+		if (t->bottom > y2)
+			y2 = t->bottom;
+
+		if (((t->left.p1.x - x1) | (t->left.p2.x - x1)) < 0) {
+			if (pixman_fixed_floor(t->left.p1.x) == pixman_fixed_floor(t->left.p2.x)) {
+				x1 = pixman_fixed_floor(t->left.p1.x);
+			} else {
+				if (t->left.p1.y == t->top)
+					fx1 = t->left.p1.x;
+				else
+					fx1 = line_x_for_y(&t->left, t->top, false);
+
+				if (t->left.p2.y == t->bottom)
+					fx2 = t->left.p2.x;
+				else
+					fx2 = line_x_for_y(&t->left, t->bottom, false);
+
+				v = min(fx1, fx2);
+				if (v < x1)
+					x1 = pixman_fixed_floor(v);
+			}
+		}
+
+		if (((x2 - t->right.p1.x) | (x2 - t->right.p2.x)) < 0) {
+			if (pixman_fixed_floor(t->right.p1.x) == pixman_fixed_floor(t->right.p2.x)) {
+				x2 = pixman_fixed_ceil(t->right.p1.x);
+			} else  {
+				if (t->right.p1.y == t->top)
+					fx1 = t->right.p1.x;
+				else
+					fx1 = line_x_for_y(&t->right, t->top, true);
+
+				if (t->right.p2.y == t->bottom)
+					fx2 = t->right.p2.x;
+				else
+					fx2 = line_x_for_y(&t->right, t->bottom, true);
+
+				v = max(fx1, fx2);
+				if (v > x2)
+					x2 = pixman_fixed_ceil(v);
+			}
+		}
+	} while (t++, --n);
+
+	box->x1 = pixman_fixed_to_int(x1);
+	box->x2 = pixman_fixed_to_int(x2);
+	box->y1 = pixman_fixed_integer_floor(y1);
+	box->y2 = pixman_fixed_integer_ceil(y2);
+}
+
 static void
 trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 		    PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
@@ -1892,7 +1974,7 @@ trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 		dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
 		dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
 
-		miTrapezoidBounds(ntrap, traps, &bounds);
+		trapezoids_bounds(ntrap, traps, &bounds);
 		if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
 			return;
 
@@ -2585,7 +2667,7 @@ mono_trapezoids_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 	dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
 	dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
 
-	miTrapezoidBounds(ntrap, traps, &extents);
+	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
 		return true;
 
@@ -2742,7 +2824,7 @@ trapezoid_span_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 	dst_x = pixman_fixed_to_int(traps[0].left.p1.x);
 	dst_y = pixman_fixed_to_int(traps[0].left.p1.y);
 
-	miTrapezoidBounds(ntrap, traps, &extents);
+	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
 		return true;
 
@@ -2905,7 +2987,7 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst,
 		return true;
 	}
 
-	miTrapezoidBounds(ntrap, traps, &extents);
+	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
 		return true;
 
@@ -3275,7 +3357,7 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
 		return true;
 	}
 
-	miTrapezoidBounds(ntrap, traps, &region.extents);
+	trapezoids_bounds(ntrap, traps, &region.extents);
 	if (region.extents.y1 >= region.extents.y2 ||
 	    region.extents.x1 >= region.extents.x2)
 		return true;
@@ -3414,7 +3496,7 @@ trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
 		return true;
 	}
 
-	miTrapezoidBounds(ntrap, traps, &extents);
+	trapezoids_bounds(ntrap, traps, &extents);
 	if (extents.y1 >= extents.y2 || extents.x1 >= extents.x2)
 		return true;
 
@@ -3841,9 +3923,6 @@ skip:
 	return true;
 }
 
-#define pixman_fixed_integer_floor(V) pixman_fixed_to_int(pixman_fixed_floor(V))
-#define pixman_fixed_integer_ceil(V) pixman_fixed_to_int(pixman_fixed_ceil(V))
-
 static void mark_damaged(PixmapPtr pixmap, struct sna_pixmap *priv,
 			 BoxPtr box, int16_t x, int16_t y)
 {
commit 75f61678249018c84872c61b4609ba9d3d0d73dc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 6 01:38:42 2012 +0000

    sna: Only need to remove the pixmap from the dirty CPU list when clearing damage
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 598e0ce..afae205 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -232,6 +232,7 @@ done:
 static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv)
 {
 	assert(priv->stride);
+	assert(priv->cpu_damage == NULL);
 
 	if (priv->cpu_bo) {
 		DBG(("%s: discarding CPU buffer, handle=%d, size=%d\n",
@@ -245,7 +246,6 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv)
 		free(priv->ptr);
 
 	priv->pixmap->devPrivate.ptr = priv->ptr = NULL;
-	list_del(&priv->list);
 	priv->mapped = 0;
 }
 
@@ -748,7 +748,6 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
-			sna_damage_destroy(&priv->cpu_damage);
 			if (priv->cpu_bo)
 				sna_pixmap_free_cpu(sna, priv);
 
@@ -1227,11 +1226,12 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 
 		sna_damage_subtract(&priv->cpu_damage, &r);
 		RegionUninit(&i);
+
+		if (priv->cpu_damage == NULL)
+			list_del(&priv->list);
 	}
 
 done:
-	if (priv->cpu_damage == NULL)
-		list_del(&priv->list);
 	if (!priv->pinned)
 		list_move(&priv->inactive, &sna->active_pixmaps);
 	return true;
@@ -1594,6 +1594,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 
 	__sna_damage_destroy(priv->cpu_damage);
 	priv->cpu_damage = NULL;
+	list_del(&priv->list);
 
 done:
 	sna_damage_reduce_all(&priv->gpu_damage,
@@ -1603,7 +1604,6 @@ done:
 		pixmap->devPrivate.ptr = NULL;
 		priv->mapped = 0;
 	}
-	list_del(&priv->list);
 	if (!priv->pinned)
 		list_move(&priv->inactive, &sna->active_pixmaps);
 	return priv;
@@ -1958,7 +1958,8 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 					if (!sna_pixmap_move_to_gpu(pixmap,
 								    MOVE_WRITE))
 						return false;
-				}
+				} else
+					sna_damage_destroy(&priv->cpu_damage);
 
 				sna_pixmap_free_cpu(sna, priv);
 			}
@@ -9326,6 +9327,7 @@ sna_accel_flush_callback(CallbackListPtr *list,
 		struct sna_pixmap *priv = list_first_entry(&sna->dirty_pixmaps,
 							   struct sna_pixmap,
 							   list);
+		assert(priv->cpu_damage != NULL);
 		sna_pixmap_move_to_gpu(priv->pixmap, MOVE_READ);
 	}
 
commit 86cc2cd3343c16b12e35e2048c113481f49196cf
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 6 01:31:15 2012 +0000

    sna: The condition for automatically using the GPU source is no CPU damage
    
    With no CPU damage to upload, we know that there is no reason not to use
    the GPU bo.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 11b3689..2501e53 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -464,7 +464,7 @@ sna_render_pixmap_bo(struct sna *sna,
 
 	priv = sna_pixmap(pixmap);
 	if (priv) {
-		if (priv->gpu_damage && priv->gpu_damage->mode == DAMAGE_ALL) {
+		if (priv->gpu_bo && priv->cpu_damage == NULL) {
 			channel->bo = kgem_bo_reference(priv->gpu_bo);
 			return 1;
 		}
commit 69c556c310da544ddb66c2441f5d06dca29fb9f3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jan 6 00:21:29 2012 +0000

    sna: Rearrange use-cpu-bo to avoid reducing GPU damage
    
    If we spot that the region is wholly contained within the CPU damage
    initially, we can conclude that is not in the GPU damage without
    reduction.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 5155681..11b3689 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -256,21 +256,28 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box)
 		return NULL;
 	}
 
-	if (priv->gpu_bo &&
-	    sna_damage_contains_box(priv->cpu_damage,
-				    box) == PIXMAN_REGION_OUT) {
-		DBG(("%s: has GPU bo and no damage to upload\n", __FUNCTION__));
-		return NULL;
-	}
+	if (priv->gpu_bo) {
+		switch (sna_damage_contains_box(priv->cpu_damage, box)) {
+		case PIXMAN_REGION_OUT:
+			DBG(("%s: has GPU bo and no damage to upload\n",
+			     __FUNCTION__));
+			return NULL;
 
-	if (sna_damage_contains_box(priv->gpu_damage,
-				    box) != PIXMAN_REGION_OUT) {
-		DBG(("%s: box is damaged on the GPU\n", __FUNCTION__));
-		return NULL;
-	}
+		case PIXMAN_REGION_IN:
+			DBG(("%s: has GPU bo but box is completely on CPU\n",
+			     __FUNCTION__));
+			break;
+		default:
+			if (sna_damage_contains_box(priv->gpu_damage,
+						    box) != PIXMAN_REGION_OUT) {
+				DBG(("%s: box is damaged on the GPU\n",
+				     __FUNCTION__));
+				return NULL;
+			}
+			break;
+		}
 
-	if (priv->gpu_bo) {
-		if (priv->gpu_bo != I915_TILING_NONE &&
+		if (priv->gpu_bo->tiling != I915_TILING_NONE &&
 		    priv->cpu_bo->pitch >= 4096) {
 			DBG(("%s: GPU bo exists and is tiled [%d], upload\n",
 			     __FUNCTION__, priv->gpu_bo->tiling));


More information about the xorg-commit mailing list