xf86-video-intel: 5 commits - src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna_driver.c src/sna/sna_render.c src/sna/sna_render_inline.h

Chris Wilson ickle at kemper.freedesktop.org
Fri Jun 24 05:47:30 PDT 2011


 src/sna/gen3_render.c       |   19 +++
 src/sna/gen4_render.c       |   20 +++-
 src/sna/gen5_render.c       |   14 ++
 src/sna/gen6_render.c       |   20 +++-
 src/sna/sna_accel.c         |    4 
 src/sna/sna_blt.c           |    9 +
 src/sna/sna_display.c       |   32 +++++-
 src/sna/sna_dri.c           |  212 ++++++++++++++------------------------------
 src/sna/sna_driver.c        |    7 -
 src/sna/sna_render.c        |    8 +
 src/sna/sna_render_inline.h |   17 +++
 11 files changed, 194 insertions(+), 168 deletions(-)

New commits:
commit 471115a9806162bf0cafe27947f49d94fdd63d87
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 24 13:32:45 2011 +0100

    sna: Also allow BLT copies to discard the alpha channel
    
    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 37eb6c2..92edc72 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3254,7 +3254,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
-	if (src->drawable.depth != dst->drawable->depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy_boxes(sna, alu,
@@ -3267,7 +3267,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	DBG(("%s (%d, %d)->(%d, %d) x %d\n",
 	     __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
 
-	if (src->drawable.depth == dst->drawable.depth &&
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -3283,7 +3283,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	    dst_bo->pitch > 8192 ||
 	    dst->drawable.width > 2048 ||
 	    dst->drawable.height > 2048) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy_boxes(sna, alu,
@@ -3399,7 +3399,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *tmp)
 {
 #if NO_COPY
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy(sna, alu,
@@ -3410,7 +3410,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 
 	/* Prefer to use the BLT */
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -3422,7 +3422,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 	    src->drawable.width > 2048 || src->drawable.height > 2048 ||
 	    dst->drawable.width > 2048 || dst->drawable.height > 2048 ||
 	    src_bo->pitch > 8192 || dst_bo->pitch > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index bb84de7..1037deb 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2150,7 +2150,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy_boxes(sna, alu,
@@ -2161,7 +2161,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 #endif
 
 	if (prefer_blt(sna) &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2172,7 +2172,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy_boxes(sna, alu,
@@ -2257,7 +2257,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *op)
 {
 #if NO_COPY
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy(sna, alu,
@@ -2267,7 +2267,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 #endif
 
 	if (prefer_blt(sna) &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2277,7 +2277,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 858a2f6..a029d18 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2099,7 +2099,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2110,7 +2110,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy_boxes(sna, alu,
@@ -2241,7 +2241,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
 	DBG(("%s (alu=%d)\n", __FUNCTION__, alu));
 
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2251,7 +2251,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index b6d9973..2f0879e 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2289,7 +2289,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy_boxes(sna, alu,
@@ -2304,7 +2304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	     src_bo == dst_bo));
 
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2315,7 +2315,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy_boxes(sna, alu,
@@ -2444,7 +2444,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *op)
 {
 #if NO_COPY
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy(sna, alu,
@@ -2459,7 +2459,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 	     dst->drawable.width, dst->drawable.height));
 
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2469,7 +2469,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
 	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
-		if (src->drawable.depth != dst->drawable.depth)
+		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 38b9113..c8bf92f 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -34,6 +34,7 @@
 
 #include "sna.h"
 #include "sna_render.h"
+#include "sna_render_inline.h"
 #include "sna_reg.h"
 
 #include <mipict.h>
@@ -977,7 +978,7 @@ sna_blt_composite(struct sna *sna,
 		return FALSE;
 	}
 
-	if (src->pDrawable->depth != dst->pDrawable->depth) {
+	if (!sna_blt_compare_depth(src->pDrawable, dst->pDrawable)) {
 		DBG(("%s: mismatching depth src=%d/%d, dst=%d/%d\n",
 		     __FUNCTION__,
 		     src->pDrawable->depth, src->pDrawable->bitsPerPixel,
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 58e9f20..21afd26 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -27,6 +27,7 @@
 
 #include "sna.h"
 #include "sna_render.h"
+#include "sna_render_inline.h"
 
 #include <fb.h>
 
@@ -51,7 +52,7 @@ sna_format_for_depth(int depth)
 	case 8: return PICT_a8;
 	case 15: return PICT_x1r5g5b5;
 	case 16: return PICT_r5g6b5;
-	default:
+	default: assert(0);
 	case 24: return PICT_x8r8g8b8;
 	case 30: return PICT_x2r10g10b10;
 	case 32: return PICT_a8r8g8b8;
@@ -92,7 +93,7 @@ no_render_copy_boxes(struct sna *sna, uint8_t alu,
 {
 	DBG(("%s (n=%d)\n", __FUNCTION__, n));
 
-	if (src->drawable.depth != dst->drawable.depth)
+	if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 		return FALSE;
 
 	return sna_blt_copy_boxes(sna, alu,
@@ -110,7 +111,7 @@ no_render_copy(struct sna *sna, uint8_t alu,
 {
 	DBG(("%s ()\n", __FUNCTION__));
 
-	if (src->drawable.depth == dst->drawable.depth &&
+	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo, dst->drawable.bitsPerPixel,
 			 tmp))
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 33d84d4..b09ad75 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -99,4 +99,21 @@ picture_is_gpu(PicturePtr picture)
 	return is_gpu(picture->pDrawable);
 }
 
+static inline Bool sna_blt_compare_depth(DrawablePtr src, DrawablePtr dst)
+{
+	if (src->depth == dst->depth)
+		return TRUE;
+
+	/* Also allow for the alpha to be discarded on a copy */
+	if (src->bitsPerPixel != dst->bitsPerPixel)
+		return FALSE;
+
+	if (dst->depth == 24 && src->depth == 32)
+		return TRUE;
+
+	/* Note that a depth-16 pixmap is r5g6b5, not x1r5g5b5. */
+
+	return FALSE;
+}
+
 #endif /* SNA_RENDER_INLINE_H */
commit c3b1a0d7046a83b6daec03e5a562116e3adf3c71
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 24 12:19:09 2011 +0100

    sna/dri: Copy to real front upon swap
    
    The front-buffer of a DRI2 drawable, may not in fact be pointing to the
    scanout pixmap. So override the destination for swapbuffers to update
    the scanout.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9d6369e..3a8a753 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -374,134 +374,81 @@ static void damage(DrawablePtr drawable, PixmapPtr pixmap, RegionPtr region)
 }
 
 static void
-sna_dri_copy_region(DrawablePtr draw,
-		    RegionPtr region,
-		    DRI2BufferPtr dst_buffer,
-		    DRI2BufferPtr src_buffer)
+sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region,
+	     DRI2BufferPtr dst_buffer, DRI2BufferPtr src_buffer,
+	     bool sync)
 {
-	struct sna *sna = to_sna_from_drawable(draw);
 	struct sna_dri_private *src_priv = src_buffer->driverPrivate;
 	struct sna_dri_private *dst_priv = dst_buffer->driverPrivate;
 	PixmapPtr src = src_priv->pixmap;
 	PixmapPtr dst = dst_priv->pixmap;
+	struct kgem_bo *dst_bo = dst_priv->bo;
 	pixman_region16_t clip;
+	bool flush = false;
+	BoxRec box, *boxes;
 	int16_t dx, dy;
+	int n;
 
-	DBG(("%s(region=(%d, %d), (%d, %d)))\n", __FUNCTION__,
-	     REGION_EXTENTS(NULL, region)->x1,
-	     REGION_EXTENTS(NULL, region)->y1,
-	     REGION_EXTENTS(NULL, region)->x2,
-	     REGION_EXTENTS(NULL, region)->y2));
-
-	DBG(("%s: draw (%d, %d)\n", __FUNCTION__, draw->x, draw->y));
-	DBG(("%s: dst -- attachment=%d, name=%d, handle=%d [screen %d]\n",
+	DBG(("%s: dst -- attachment=%d, name=%d, handle=%d [screen=%d]\n",
 	     __FUNCTION__,
 	     dst_buffer->attachment,
 	     dst_buffer->name,
 	     dst_priv->bo->handle,
-	     sna_pixmap(sna->front)->gpu_bo->handle));
+	     sna_pixmap_get_bo(sna->front)->handle));
 	DBG(("%s: src -- attachment=%d, name=%d, handle=%d\n",
 	     __FUNCTION__,
 	     src_buffer->attachment,
 	     src_buffer->name,
 	     src_priv->bo->handle));
 
-	if (draw->type == DRAWABLE_WINDOW) {
+	if (draw->type == DRAWABLE_PIXMAP) {
+		if (region) {
+			boxes = REGION_RECTS(region);
+			n = REGION_NUM_RECTS(region);
+			if (n == 0)
+				return;
+		} else {
+			box.x1 = box.y1 = 0;
+			box.x2 = draw->width;
+			box.y2 = draw->height;
+
+			boxes = &box;
+			n = 1;
+		}
+		dx = dy = 0;
+	} else {
 		WindowPtr win = (WindowPtr)draw;
 
 		DBG(("%s: draw=(%d, %d), delta=(%d, %d)\n",
 		     __FUNCTION__, draw->x, draw->y,
 		     get_drawable_dx(draw), get_drawable_dy(draw)));
-		pixman_region_translate(region, draw->x, draw->y);
-
-		pixman_region_init(&clip);
-		pixman_region_intersect(&clip, &win->clipList, region);
-		if (!pixman_region_not_empty(&clip)) {
-			DBG(("%s: all clipped\n", __FUNCTION__));
-			return;
-		}
-		region = &clip;
-
-		get_drawable_deltas(draw, dst, &dx, &dy);
-
-		DBG(("%s clipped=(%d, %d), (%d, %d)x%d\n", __FUNCTION__,
-		     REGION_EXTENTS(NULL, region)->x1,
-		     REGION_EXTENTS(NULL, region)->y1,
-		     REGION_EXTENTS(NULL, region)->x2,
-		     REGION_EXTENTS(NULL, region)->y2,
-		     REGION_NUM_RECTS(region)));
+		if (region) {
+			pixman_region_translate(region, draw->x, draw->y);
+
+			pixman_region_init(&clip);
+			pixman_region_intersect(&clip, &win->clipList, region);
+			if (!pixman_region_not_empty(&clip)) {
+				DBG(("%s: all clipped\n", __FUNCTION__));
+				return;
+			}
+			region = &clip;
 
-		if (dst_buffer->attachment == DRI2BufferFrontLeft) {
-			assert(dst == sna->front);
-			assert(dst_priv->bo == sna_pixmap(sna->front)->gpu_bo);
+			boxes = REGION_RECTS(region);
+			n = REGION_NUM_RECTS(region);
+		} else {
+			boxes = REGION_RECTS(&win->clipList);
+			n = REGION_NUM_RECTS(&win->clipList);
+			region = &win->clipList;
 		}
-	} else {
-		assert(draw->x == 0);
-		assert(draw->y == 0);
-		dx = dy = 0;
-	}
-
-	assert(sna_pixmap(src)->cpu_damage == NULL);
-	assert(sna_pixmap(dst)->cpu_damage == NULL);
-
-	/* It's important that this copy gets submitted before the
-	 * direct rendering client submits rendering for the next
-	 * frame, but we don't actually need to submit right now.  The
-	 * client will wait for the DRI2CopyRegion reply or the swap
-	 * buffer event before rendering, and we'll hit the flush
-	 * callback chain before those messages are sent.  We submit
-	 * our batch buffers from the flush callback chain so we know
-	 * that will happen before the client tries to render
-	 * again.
-	 */
-	sna->render.copy_boxes(sna, GXcopy,
-			       src, src_priv->bo, -draw->x, -draw->y,
-			       dst, dst_priv->bo, dx, dy,
-			       REGION_RECTS(region),
-			       REGION_NUM_RECTS(region));
-
-	damage(draw, dst, region);
-	if (region == &clip)
-		pixman_region_fini(&clip);
-}
-
-static void
-sna_dri_swap_blit(struct sna *sna, DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back)
-{
-	struct sna_dri_private *src_priv = back->driverPrivate;
-	struct sna_dri_private *dst_priv = front->driverPrivate;
-	PixmapPtr src = src_priv->pixmap;
-	PixmapPtr dst = dst_priv->pixmap;
-	bool flush = false;
-	BoxRec box, *boxes;
-	int16_t dx, dy;
-	int n;
-
-	DBG(("%s: back -- attachment=%d, name=%d, handle=%d\n",
-	     __FUNCTION__,
-	     back->attachment,
-	     back->name,
-	     src_priv->bo->handle));
-
-	if (draw->type == DRAWABLE_PIXMAP) {
-		box.x1 = box.y1 = 0;
-		box.x2 = draw->width;
-		box.y2 = draw->height;
-
-		boxes = &box;
-		n = 1;
-		dx = dy = 0;
-	} else {
-		WindowPtr win = (WindowPtr)draw;
-
-		boxes = REGION_RECTS(&win->clipList);
-		n = REGION_NUM_RECTS(&win->clipList);
 		if (n == 0)
 			return;
 
-		flush = sna_wait_for_scanline(sna, sna->front,
-					      NULL, &win->clipList.extents);
+		if (sync)
+			flush = sna_wait_for_scanline(sna, sna->front, NULL,
+						      &region->extents);
 
+		dst = sna->front;
+		dst_bo = sna_pixmap_get_bo(sna->front);
 		get_drawable_deltas(draw, dst, &dx, &dy);
 	}
 
@@ -517,14 +464,27 @@ sna_dri_swap_blit(struct sna *sna, DrawablePtr draw, DRI2BufferPtr front, DRI2Bu
 	 */
 	sna->render.copy_boxes(sna, GXcopy,
 			       src, src_priv->bo, -draw->x, -draw->y,
-			       dst, dst_priv->bo, dx, dy,
+			       dst, dst_bo, dx, dy,
 			       boxes, n);
 
-	damage(draw, dst, NULL);
+	damage(draw, dst, region);
 
 	DBG(("%s: flushing? %d\n", __FUNCTION__, flush));
 	if (flush) /* STAT! */
 		kgem_submit(&sna->kgem);
+
+	if (region == &clip)
+		pixman_region_fini(&clip);
+}
+
+static void
+sna_dri_copy_region(DrawablePtr draw,
+		    RegionPtr region,
+		    DRI2BufferPtr dst_buffer,
+		    DRI2BufferPtr src_buffer)
+{
+	sna_dri_copy(to_sna_from_drawable(draw), draw,region,
+		     dst_buffer, src_buffer, false);
 }
 
 #if DRI2INFOREC_VERSION >= 4
@@ -841,7 +801,7 @@ static void sna_dri_vblank_handle(int fd,
 		}
 		/* else fall through to exchange/blit */
 	case DRI2_SWAP:
-		sna_dri_swap_blit(sna, draw, info->front, info->back);
+		sna_dri_copy(sna, draw, NULL, info->front, info->back, true);
 	case DRI2_SWAP_THROTTLE:
 		DRI2SwapComplete(info->client,
 				 draw, frame,
@@ -1145,7 +1105,7 @@ immediate:
 		 if (drmWaitVBlank(sna->kgem.fd, &vbl))
 			 sna_dri_frame_event_info_free(info);
 
-		 sna_dri_swap_blit(sna, draw, front, back);
+		 sna_dri_copy(sna, draw, NULL, front, back, true);
 		 return TRUE;
 	}
 
@@ -1207,7 +1167,7 @@ immediate:
 
 blit_fallback:
 	DBG(("%s -- blit\n", __FUNCTION__));
-	sna_dri_swap_blit(sna, draw, front, back);
+	sna_dri_copy(sna, draw, NULL, front, back, true);
 	if (info)
 		sna_dri_frame_event_info_free(info);
 	DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
@@ -1233,41 +1193,7 @@ sna_dri_async_swap(ClientPtr client, DrawablePtr draw,
 	DBG(("%s()\n", __FUNCTION__));
 
 	if (!can_flip(sna, draw, front, back)) {
-		BoxRec box, *boxes;
-		int16_t dx, dy;
-		int n;
-
-		if (draw->type == DRAWABLE_PIXMAP) {
-			box.x1 = box.y1 = 0;
-			box.x2 = draw->width;
-			box.y2 = draw->height;
-
-			boxes = &box;
-			n = 1;
-			dx = dy = 0;
-		} else {
-			WindowPtr win = (WindowPtr)draw;
-
-			assert(front_priv->pixmap == sna->front);
-			boxes = REGION_RECTS(&win->clipList);
-			n = REGION_NUM_RECTS(&win->clipList);
-			get_drawable_deltas(draw, front_priv->pixmap, &dx, &dy);
-		}
-
-		DBG(("%s: fallback blit: %dx%d\n",
-		     __FUNCTION__, draw->width, draw->height));
-
-		if (n) {
-			sna->render.copy_boxes(sna, GXcopy,
-					       back_priv->pixmap,
-					       back_priv->bo,
-					       -draw->x, -draw->y,
-					       front_priv->pixmap,
-					       front_priv->bo,
-					       dx, dy,
-					       boxes, n);
-		}
-
+		sna_dri_copy(sna, draw, NULL, front, back, false);
 		DRI2SwapComplete(client, draw, 0, 0, 0,
 				 DRI2_BLIT_COMPLETE, func, data);
 		return;
commit 669378cd8db8af89d12f1b95a07fc1ead0b1569c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 24 11:53:17 2011 +0100

    sna: Wrap the fbcon in a scratch pixmap for render-copy across depth changes
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 21554f1..285a39b 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -506,6 +506,7 @@ void sna_copy_fbcon(struct sna *sna)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
 	drmModeFBPtr fbcon;
+	PixmapPtr scratch;
 	struct sna_pixmap *priv;
 	struct kgem_bo *bo;
 	BoxRec box;
@@ -533,7 +534,15 @@ void sna_copy_fbcon(struct sna *sna)
 	if (fbcon == NULL)
 		return;
 
-	if (fbcon->depth != sna->front->drawable.depth)
+	/* Wrap the fbcon in a pixmap so that we select the right formats
+	 * in the render copy in case we need to preserve the fbcon
+	 * across a depth change upon starting X.
+	 */
+	scratch = GetScratchPixmapHeader(sna->scrn->pScreen,
+					fbcon->width, fbcon->height,
+					fbcon->depth, fbcon->bpp,
+					0, NULL);
+	if (scratch == NullPixmap)
 		goto cleanup_fbcon;
 
 	box.x1 = box.y1 = 0;
@@ -542,7 +551,7 @@ void sna_copy_fbcon(struct sna *sna)
 
 	bo = sna_create_bo_for_fbcon(sna, fbcon);
 	if (bo == NULL)
-		goto cleanup_fbcon;
+		goto cleanup_scratch;
 
 	priv = sna_pixmap(sna->front);
 	assert(priv && priv->gpu_bo);
@@ -560,7 +569,7 @@ void sna_copy_fbcon(struct sna *sna)
 		dy = (sna->front->drawable.height - box.y2) / 2.;
 
 	ok = sna->render.copy_boxes(sna, GXcopy,
-				    sna->front, bo, sx, sy,
+				    scratch, bo, sx, sy,
 				    sna->front, priv->gpu_bo, dx, dy,
 				    &box, 1);
 	sna_damage_add_box(&priv->gpu_damage, &box);
@@ -569,6 +578,8 @@ void sna_copy_fbcon(struct sna *sna)
 
 	sna->scrn->pScreen->canDoBGNoneRoot = ok;
 
+cleanup_scratch:
+	FreeScratchPixmapHeader(scratch);
 cleanup_fbcon:
 	drmModeFreeFB(fbcon);
 }
commit 33b2ea0392fe944b210ef744398aa22989bfdf33
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 24 11:43:07 2011 +0100

    sna: Avoid using the BLT to copy between mismatching depths
    
    We either conflated bpp (which fails given a mixture of depth-24 and
    depth-30 pixmaps) or neglected to check at all.
    
    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 1252ba4..37eb6c2 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3254,6 +3254,9 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
+	if (src->drawable.depth != dst->drawable->depth)
+		return FALSE;
+
 	return sna_blt_copy_boxes(sna, alu,
 				  src_bo, src_dx, src_dy,
 				  dst_bo, dst_dx, dst_dy,
@@ -3264,7 +3267,8 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	DBG(("%s (%d, %d)->(%d, %d) x %d\n",
 	     __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
 
-	if (sna_blt_copy_boxes(sna, alu,
+	if (src->drawable.depth == dst->drawable.depth &&
+	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
 			       dst->drawable.bitsPerPixel,
@@ -3278,12 +3282,16 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
 	    src->drawable.height > 2048 ||
 	    dst_bo->pitch > 8192 ||
 	    dst->drawable.width > 2048 ||
-	    dst->drawable.height > 2048)
+	    dst->drawable.height > 2048) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy_boxes(sna, alu,
 					  src_bo, src_dx, src_dy,
 					  dst_bo, dst_dx, dst_dy,
 					  dst->drawable.bitsPerPixel,
 					  box, n);
+	}
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo))
 		kgem_submit(&sna->kgem);
@@ -3391,6 +3399,9 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *tmp)
 {
 #if NO_COPY
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy(sna, alu,
 			    src_bo, dst_bo,
 			    dst->drawable.bitsPerPixel,
@@ -3399,7 +3410,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 
 	/* Prefer to use the BLT */
 	if (sna->kgem.mode == KGEM_BLT &&
-	    src->drawable.bitsPerPixel == dst->drawable.bitsPerPixel &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -3411,7 +3422,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
 	    src->drawable.width > 2048 || src->drawable.height > 2048 ||
 	    dst->drawable.width > 2048 || dst->drawable.height > 2048 ||
 	    src_bo->pitch > 8192 || dst_bo->pitch > 8192) {
-		if (src->drawable.bitsPerPixel != dst->drawable.bitsPerPixel)
+		if (src->drawable.depth != dst->drawable.depth)
 			return FALSE;
 
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 2a2ecab..bb84de7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2150,6 +2150,9 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy_boxes(sna, alu,
 				  src_bo, src_dx, src_dy,
 				  dst_bo, dst_dx, dst_dy,
@@ -2158,6 +2161,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 #endif
 
 	if (prefer_blt(sna) &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2167,12 +2171,16 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy_boxes(sna, alu,
 					  src_bo, src_dx, src_dy,
 					  dst_bo, dst_dx, dst_dy,
 					  dst->drawable.bitsPerPixel,
 					  box, n);
+	}
 
 	DBG(("%s (%d, %d)->(%d, %d) x %d\n",
 	     __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
@@ -2249,6 +2257,9 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *op)
 {
 #if NO_COPY
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy(sna, alu,
 			    src_bo, dst_bo,
 			    dst->drawable.bitsPerPixel,
@@ -2256,6 +2267,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 #endif
 
 	if (prefer_blt(sna) &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2264,10 +2276,14 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
 				    dst->drawable.bitsPerPixel,
 				    op);
+	}
 
 	op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
 
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 77ad1bb..858a2f6 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2099,6 +2099,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 	if (sna->kgem.mode == KGEM_BLT &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2108,12 +2109,16 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy_boxes(sna, alu,
 					  src_bo, src_dx, src_dy,
 					  dst_bo, dst_dx, dst_dy,
 					  dst->drawable.bitsPerPixel,
 					  box, n);
+	}
 
 	DBG(("%s (%d, %d)->(%d, %d) x %d\n",
 	     __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
@@ -2236,6 +2241,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
 	DBG(("%s (alu=%d)\n", __FUNCTION__, alu));
 
 	if (sna->kgem.mode == KGEM_BLT &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2244,10 +2250,14 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
 				    dst->drawable.bitsPerPixel,
 				    op);
+	}
 
 	op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
 
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 4f3e41a..b6d9973 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2289,6 +2289,9 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	struct sna_composite_op tmp;
 
 #if NO_COPY_BOXES
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy_boxes(sna, alu,
 				  src_bo, src_dx, src_dy,
 				  dst_bo, dst_dx, dst_dy,
@@ -2301,6 +2304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 	     src_bo == dst_bo));
 
 	if (sna->kgem.mode == KGEM_BLT &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
 			       dst_bo, dst_dx, dst_dy,
@@ -2310,12 +2314,16 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy_boxes(sna, alu,
 					  src_bo, src_dx, src_dy,
 					  dst_bo, dst_dx, dst_dy,
 					  dst->drawable.bitsPerPixel,
 					  box, n);
+	}
 	tmp.op = alu == GXcopy ? PictOpSrc : PictOpClear;
 
 	tmp.dst.pixmap = dst;
@@ -2436,6 +2444,9 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 		 struct sna_copy_op *op)
 {
 #if NO_COPY
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy(sna, alu,
 			    src_bo, dst_bo,
 			    dst->drawable.bitsPerPixel,
@@ -2448,6 +2459,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 	     dst->drawable.width, dst->drawable.height));
 
 	if (sna->kgem.mode == KGEM_BLT &&
+	    src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo,
 			 dst->drawable.bitsPerPixel,
@@ -2456,10 +2468,14 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
 	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+		if (src->drawable.depth != dst->drawable.depth)
+			return FALSE;
+
 		return sna_blt_copy(sna, alu, src_bo, dst_bo,
 				    dst->drawable.bitsPerPixel,
 				    op);
+	}
 
 	op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
 
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0155ede..37f8fb0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1359,9 +1359,7 @@ sna_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	DBG(("%s: src=(%d, %d)x(%d, %d) -> dst=(%d, %d)\n",
 	     __FUNCTION__, src_x, src_y, width, height, dst_x, dst_y));
 
-	if (sna->kgem.wedged ||
-	    src->bitsPerPixel != dst->bitsPerPixel ||
-	    !PM_IS_SOLID(dst, gc->planemask)) {
+	if (sna->kgem.wedged || !PM_IS_SOLID(dst, gc->planemask)) {
 		BoxRec box;
 		RegionRec region;
 
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 35fdc12..38b9113 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -977,11 +977,11 @@ sna_blt_composite(struct sna *sna,
 		return FALSE;
 	}
 
-	if (src->pDrawable->bitsPerPixel != dst->pDrawable->bitsPerPixel) {
-		DBG(("%s: mismatching bpp src=%d, dst=%d\n",
+	if (src->pDrawable->depth != dst->pDrawable->depth) {
+		DBG(("%s: mismatching depth src=%d/%d, dst=%d/%d\n",
 		     __FUNCTION__,
-		     src->pDrawable->bitsPerPixel,
-		     dst->pDrawable->bitsPerPixel));
+		     src->pDrawable->depth, src->pDrawable->bitsPerPixel,
+		     dst->pDrawable->depth, dst->pDrawable->bitsPerPixel));
 		return FALSE;
 	}
 
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index d4a3e3f..9d6369e 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -206,7 +206,7 @@ sna_dri_create_buffer(DrawablePtr drawable,
 		usage = 0;
 		if (drawable->width == sna->front->drawable.width &&
 		    drawable->height == sna->front->drawable.height &&
-		    drawable->bitsPerPixel == sna->front->drawable.bitsPerPixel)
+		    drawable->depth == sna->front->drawable.depth)
 			usage = SNA_CREATE_FB;
 
 	case DRI2BufferFakeFrontLeft:
@@ -777,10 +777,12 @@ can_flip(struct sna * sna,
 		return FALSE;
 	}
 
-	if (front_pixmap->drawable.bitsPerPixel != back_pixmap->drawable.bitsPerPixel) {
-		DBG(("%s -- no, depth mismatch: front bpp=%d, back=%d\n",
+	if (front_pixmap->drawable.depth != back_pixmap->drawable.depth) {
+		DBG(("%s -- no, depth mismatch: front bpp=%d/%d, back=%d/%d\n",
 		     __FUNCTION__,
+		     front_pixmap->drawable.depth,
 		     front_pixmap->drawable.bitsPerPixel,
+		     back_pixmap->drawable.depth,
 		     back_pixmap->drawable.bitsPerPixel));
 		return FALSE;
 	}
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index b05689d..58e9f20 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -92,6 +92,9 @@ no_render_copy_boxes(struct sna *sna, uint8_t alu,
 {
 	DBG(("%s (n=%d)\n", __FUNCTION__, n));
 
+	if (src->drawable.depth != dst->drawable.depth)
+		return FALSE;
+
 	return sna_blt_copy_boxes(sna, alu,
 				  src_bo, src_dx, src_dy,
 				  dst_bo, dst_dx, dst_dy,
@@ -107,7 +110,7 @@ no_render_copy(struct sna *sna, uint8_t alu,
 {
 	DBG(("%s ()\n", __FUNCTION__));
 
-	if (src->drawable.bitsPerPixel != dst->drawable.bitsPerPixel &&
+	if (src->drawable.depth == dst->drawable.depth &&
 	    sna_blt_copy(sna, alu,
 			 src_bo, dst_bo, dst->drawable.bitsPerPixel,
 			 tmp))
commit 28f6dc24d3c50aa399dd098a9ba6a18a95837800
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jun 24 11:24:59 2011 +0100

    sna: Support depth-30 and some more logging to show the depth
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index f92a1db..21554f1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -427,11 +427,19 @@ sna_crtc_restore(struct sna *sna)
 
 	assert(bo->tiling != I915_TILING_Y);
 
+	DBG(("%s: create fb %dx%d@%d/%d\n",
+	     __FUNCTION__,
+	     sna->front->drawable.width,
+	     sna->front->drawable.height,
+	     sna->front->drawable.depth,
+	     sna->front->drawable.bitsPerPixel));
+
 	sna_mode_remove_fb(sna);
 	if (drmModeAddFB(sna->kgem.fd,
 			 sna->front->drawable.width,
 			 sna->front->drawable.height,
-			 scrn->depth, scrn->bitsPerPixel,
+			 sna->front->drawable.depth,
+			 sna->front->drawable.bitsPerPixel,
 			 bo->pitch, bo->handle,
 			 &sna->mode.fb_id))
 		return;
@@ -590,6 +598,11 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 		if (!bo)
 			return FALSE;
 
+		DBG(("%s: create fb %dx%d@%d/%d\n",
+		     __FUNCTION__,
+		     scrn->virtualX, scrn->virtualY,
+		     scrn->depth, scrn->bitsPerPixel));
+
 		assert(bo->tiling != I915_TILING_Y);
 		ret = drmModeAddFB(sna->kgem.fd,
 				   scrn->virtualX, scrn->virtualY,
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 4ae6b5f..0ef4dff 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -176,10 +176,10 @@ sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
  */
 static Bool sna_create_screen_resources(ScreenPtr screen)
 {
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
-	struct sna *sna = to_sna(scrn);
+	struct sna *sna = to_sna_from_screen(screen);
 
-	DBG(("%s\n", __FUNCTION__));
+	DBG(("%s(%dx%d@%d)\n", __FUNCTION__,
+	     screen->width, screen->height, screen->rootDepth));
 
 	free(screen->devPrivate);
 	screen->devPrivate = NULL;
@@ -453,6 +453,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	case 15:
 	case 16:
 	case 24:
+	case 30:
 		break;
 	default:
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,


More information about the xorg-commit mailing list