xf86-video-intel: 5 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c src/sna/sna_blt.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Oct 30 16:42:27 CET 2013


 src/sna/gen2_render.c |    8 
 src/sna/gen3_render.c |   10 
 src/sna/gen4_render.c |   11 
 src/sna/gen5_render.c |   14 
 src/sna/gen7_render.c |   19 
 src/sna/kgem.c        |    6 
 src/sna/sna_accel.c   |  978 ++++++++++++++++++++++++++++++--------------------
 src/sna/sna_blt.c     |   24 +
 8 files changed, 666 insertions(+), 404 deletions(-)

New commits:
commit ed282456240cc0a7ae9a235ea8aea14a8b8a54ef
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 30 13:26:23 2013 +0000

    sna: Assert that the batch is in the correct mode prior to inserting BLT commands
    
    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 f8a3e48..06753ec 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4566,6 +4566,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 				src += src_stride;
 			} while (--bh);
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_MONO_SRC_COPY | 3 << 20;
 			b[0] |= ((box->x1 - x) & 7) << 17;
@@ -4701,6 +4702,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 					src += src_stride;
 				} while (--bh);
 
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = XY_FULL_MONO_PATTERN_MONO_SRC_BLT | 3 << 20;
 				b[0] |= ((box->x1 - x) & 7) << 17;
@@ -7406,6 +7408,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride) | br00;
 			b[0] |= ((box->x1 + sx) & 7) << 17;
@@ -7461,6 +7464,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
 
 			sigtrap_assert();
 			if (sigtrap_get() == 0) {
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 
 				b[0] = XY_MONO_SRC_COPY | br00;
@@ -7695,6 +7699,7 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
 				}
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = br00 | ((box->x1 + sx) & 7) << 17;
 			b[1] = br13;
@@ -11261,6 +11266,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 			assert(r->x + dx + r->width  <= pixmap->drawable.width);
 			assert(r->y + dy + r->height <= pixmap->drawable.height);
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_PAT_BLT | tx << 12 | ty << 8 | 3 << 20 | (br00 & BLT_DST_TILED);
 			b[1] = br13;
@@ -11279,6 +11285,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 		} else do {
 			int n_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_SETUP_BLT | 3 << 20;
 			b[1] = br13;
@@ -11303,6 +11310,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 			assert(n_this_time);
 			n -= n_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3*n_this_time;
 			do {
@@ -11341,6 +11349,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 		unwind_batch = sna->kgem.nbatch;
 		unwind_reloc = sna->kgem.nreloc;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		b = sna->kgem.batch + sna->kgem.nbatch;
 		b[0] = XY_SETUP_BLT | 3 << 20;
 		b[1] = br13;
@@ -11378,6 +11387,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 						unwind_batch = sna->kgem.nbatch;
 						unwind_reloc = sna->kgem.nreloc;
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = XY_SETUP_BLT | 3 << 20;
 						b[1] = br13;
@@ -11410,6 +11420,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 					if (tx < 0)
 						tx = 8 - tx;
 
+					assert(sna->kgem.mode == KGEM_BLT);
 					b = sna->kgem.batch + sna->kgem.nbatch;
 					b[0] = br00 | tx << 12 | ty << 8;
 					b[1] = (box.y1 + dy) << 16 | (box.x1 + dx);
@@ -11449,6 +11460,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 							unwind_batch = sna->kgem.nbatch;
 							unwind_reloc = sna->kgem.nreloc;
 
+							assert(sna->kgem.mode == KGEM_BLT);
 							b = sna->kgem.batch + sna->kgem.nbatch;
 							b[0] = XY_SETUP_BLT | 3 << 20;
 							b[1] = br13;
@@ -11481,6 +11493,7 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 						if (tx < 0)
 							tx = 8 - tx;
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = br00 | tx << 12 | ty << 8;
 						b[1] = (bb.y1 + dy) << 16 | (bb.x1 + dx);
@@ -11895,6 +11908,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 			DBG(("%s: single unclipped rect (%d, %d)x(%d, %d)\n",
 			     __FUNCTION__, r->x + dx, r->y + dy, r->width, r->height));
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_MONO_PAT | (br00 & (BLT_DST_TILED | 0x7<<12 | 0x7<<8)) | 3<<20;
 			b[1] = br13;
@@ -11913,6 +11927,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 		} else do {
 			int n_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 3 << 20;
 			b[1] = br13;
@@ -11935,6 +11950,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 			assert(n_this_time);
 			n -= n_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3 * n_this_time;
 			do {
@@ -11965,6 +11981,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 		if (!region_maybe_clip(&clip, gc->pCompositeClip))
 			return true;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		b = sna->kgem.batch + sna->kgem.nbatch;
 		b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 3 << 20;
 		b[1] = br13;
@@ -11996,6 +12013,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 						_kgem_submit(&sna->kgem);
 						_kgem_set_mode(&sna->kgem, KGEM_BLT);
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 3 << 20;
 						b[1] = br13;
@@ -12013,6 +12031,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 						sna->kgem.nbatch += 9;
 					}
 
+					assert(sna->kgem.mode == KGEM_BLT);
 					b = sna->kgem.batch + sna->kgem.nbatch;
 					sna->kgem.nbatch += 3;
 					b[0] = br00;
@@ -12048,6 +12067,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 							_kgem_submit(&sna->kgem);
 							_kgem_set_mode(&sna->kgem, KGEM_BLT);
 
+							assert(sna->kgem.mode == KGEM_BLT);
 							b = sna->kgem.batch + sna->kgem.nbatch;
 							b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 3 << 20;
 							b[1] = br13;
@@ -12065,6 +12085,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
 							sna->kgem.nbatch += 9;
 						}
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						sna->kgem.nbatch += 3;
 						b[0] = br00;
@@ -12199,6 +12220,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 					_kgem_set_mode(&sna->kgem, KGEM_BLT);
 				}
 
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride) | br00;
 				b[0] |= ((r->x - origin->x) & 7) << 17;
@@ -12267,6 +12289,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 						src += src_stride;
 					} while (--bh);
 
+					assert(sna->kgem.mode == KGEM_BLT);
 					b = sna->kgem.batch + sna->kgem.nbatch;
 					b[0] = XY_MONO_SRC_COPY | br00;
 					b[0] |= ((r->x - origin->x) & 7) << 17;
@@ -12350,6 +12373,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 						_kgem_set_mode(&sna->kgem, KGEM_BLT);
 					}
 
+					assert(sna->kgem.mode == KGEM_BLT);
 					b = sna->kgem.batch + sna->kgem.nbatch;
 					b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride) | br00;
 					b[0] |= ((box.x1 - pat.x) & 7) << 17;
@@ -12415,6 +12439,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 							src += src_stride;
 						} while (--bh);
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = XY_MONO_SRC_COPY | br00;
 						b[0] |= ((box.x1 - pat.x) & 7) << 17;
@@ -12499,6 +12524,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 							_kgem_set_mode(&sna->kgem, KGEM_BLT);
 						}
 
+						assert(sna->kgem.mode == KGEM_BLT);
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride) | br00;
 						b[0] |= ((box.x1 - pat.x) & 7) << 17;
@@ -12564,6 +12590,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 								src += src_stride;
 							} while (--bh);
 
+							assert(sna->kgem.mode == KGEM_BLT);
 							b = sna->kgem.batch + sna->kgem.nbatch;
 							b[0] = XY_MONO_SRC_COPY | br00;
 							b[0] |= ((box.x1 - pat.x) & 7) << 17;
@@ -12657,6 +12684,7 @@ sna_poly_fill_rect_stippled_n_box__imm(struct sna *sna,
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = br00 | (5 + len) | (ox & 7) << 17;
 			b[1] = br13;
@@ -12763,6 +12791,7 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 
 			if (!use_tile && len <= 32) {
@@ -12816,6 +12845,7 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
 						return;
 				}
 
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = br00 | (ox & 7) << 17;
 				b[1] = br13;
@@ -13748,6 +13778,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 	unwind_batch = sna->kgem.nbatch;
 	unwind_reloc = sna->kgem.nreloc;
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = sna->kgem.batch + sna->kgem.nbatch;
 	b[0] = XY_SETUP_BLT | 3 << 20;
 	b[1] = bo->pitch;
@@ -13810,6 +13841,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				unwind_batch = sna->kgem.nbatch;
 				unwind_reloc = sna->kgem.nreloc;
 
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = XY_SETUP_BLT | 3 << 20;
 				b[1] = bo->pitch;
@@ -13831,6 +13863,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				sna->kgem.nbatch += 8;
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3 + len;
 
@@ -13864,6 +13897,7 @@ skip:
 			break;
 
 		if (kgem_check_batch(&sna->kgem, 3)) {
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3;
 
@@ -14419,6 +14453,8 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 	     __FUNCTION__,
 	     extents->x1, extents->y1,
 	     extents->x2, extents->y2));
+
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = sna->kgem.batch + sna->kgem.nbatch;
 	b[0] = XY_SETUP_BLT | 1 << 20;
 	b[1] = bo->pitch;
@@ -14503,6 +14539,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				     extents->x1, extents->y1,
 				     extents->x2, extents->y2));
 
+				assert(sna->kgem.mode == KGEM_BLT);
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = XY_SETUP_BLT | 1 << 20;
 				b[1] = bo->pitch;
@@ -14525,6 +14562,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				sna->kgem.nbatch += 8;
 			}
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3 + len;
 
@@ -14565,6 +14603,7 @@ skip:
 			break;
 
 		if (kgem_check_batch(&sna->kgem, 3 + 5)) {
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			sna->kgem.nbatch += 3;
 
@@ -14856,6 +14895,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
 				src += src_stride;
 			} while (--bh);
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = sna->kgem.batch + sna->kgem.nbatch;
 			b[0] = XY_MONO_SRC_COPY | 3 << 20;
 			b[0] |= ((box->x1 - region->extents.x1) & 7) << 17;
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 94486bc..0169d11 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -106,6 +106,7 @@ static void gen6_blt_copy_done(struct sna *sna, const struct sna_composite_op *o
 
 	if (kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
+		assert(sna->kgem.mode == KGEM_BLT);
 		b[0] = XY_SETUP_CLIP;
 		b[1] = b[2] = 0;
 		kgem->nbatch += 3;
@@ -178,6 +179,7 @@ static bool sna_blt_fill_init(struct sna *sna,
 			_kgem_set_mode(kgem, KGEM_BLT);
 		}
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_MONO_PATTERN_SL_BLT;
 		if (bpp == 32)
@@ -252,6 +254,7 @@ inline static void sna_blt_fill_one(struct sna *sna,
 	if (!kgem_check_batch(kgem, 3))
 		sna_blt_fill_begin(sna, blt);
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = kgem->batch + kgem->nbatch;
 	kgem->nbatch += 3;
 	assert(kgem->nbatch < kgem->surface);
@@ -394,6 +397,7 @@ static void sna_blt_alpha_fixup_one(struct sna *sna,
 		_kgem_set_mode(kgem, KGEM_BLT);
 	}
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = kgem->batch + kgem->nbatch;
 	b[0] = blt->cmd;
 	b[1] = blt->br13;
@@ -450,6 +454,7 @@ static void sna_blt_copy_one(struct sna *sna,
 	    kgem->reloc[kgem->nreloc-1].target_handle == blt->bo[1]->target_handle) {
 		DBG(("%s: replacing last fill\n", __FUNCTION__));
 		if (kgem_check_batch(kgem, 8-6)) {
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = kgem->batch + kgem->nbatch - 6;
 			b[0] = blt->cmd;
 			b[1] = blt->br13;
@@ -474,6 +479,7 @@ static void sna_blt_copy_one(struct sna *sna,
 		_kgem_set_mode(kgem, KGEM_BLT);
 	}
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = kgem->batch + kgem->nbatch;
 	b[0] = blt->cmd;
 	b[1] = blt->br13;
@@ -865,6 +871,7 @@ inline static void _sna_blt_fill_box(struct sna *sna,
 	if (!kgem_check_batch(kgem, 3))
 		sna_blt_fill_begin(sna, blt);
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = kgem->batch + kgem->nbatch;
 	kgem->nbatch += 3;
 	assert(kgem->nbatch < kgem->surface);
@@ -890,6 +897,7 @@ inline static void _sna_blt_fill_boxes(struct sna *sna,
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		int nbox_this_time;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		nbox_this_time = nbox;
 		if (3*nbox_this_time > kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED)
 			nbox_this_time = (kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED) / 3;
@@ -967,6 +975,7 @@ static void blt_composite_fill_boxes_no_offset__thread(struct sna *sna,
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		int nbox_this_time;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		nbox_this_time = nbox;
 		if (3*nbox_this_time > kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED)
 			nbox_this_time = (kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED) / 3;
@@ -1076,6 +1085,7 @@ static void blt_composite_fill_boxes__thread(struct sna *sna,
 		uint32_t *b = kgem->batch + kgem->nbatch;
 		int nbox_this_time;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		nbox_this_time = nbox;
 		if (3*nbox_this_time > kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED)
 			nbox_this_time = (kgem->surface - kgem->nbatch - KGEM_BATCH_RESERVED) / 3;
@@ -1364,6 +1374,7 @@ static void blt_composite_copy_boxes__thread(struct sna *sna,
 			assert(nbox_this_time);
 			nbox -= nbox_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			do {
 				uint32_t *b = kgem->batch + kgem->nbatch;
 
@@ -1416,6 +1427,7 @@ static void blt_composite_copy_boxes__thread(struct sna *sna,
 			assert(nbox_this_time);
 			nbox -= nbox_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			do {
 				uint32_t *b = kgem->batch + kgem->nbatch;
 
@@ -2329,6 +2341,7 @@ static void gen6_convert_done(struct sna *sna, const struct sna_composite_op *op
 
 	if (kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
+		assert(sna->kgem.mode == KGEM_BLT);
 		b[0] = XY_SETUP_CLIP;
 		b[1] = b[2] = 0;
 		kgem->nbatch += 3;
@@ -2652,6 +2665,7 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu,
 	assert(kgem_check_batch(kgem, 6));
 	assert(kgem_check_reloc(kgem, 1));
 
+	assert(sna->kgem.mode == KGEM_BLT);
 	b = kgem->batch + kgem->nbatch;
 	b[0] = cmd;
 	b[1] = br13;
@@ -2741,6 +2755,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 			_kgem_set_mode(kgem, KGEM_BLT);
 		}
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		b = kgem->batch + kgem->nbatch;
 		b[0] = XY_SETUP_MONO_PATTERN_SL_BLT;
 		if (bpp == 32)
@@ -2774,6 +2789,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 		assert(nbox_this_time);
 		nbox -= nbox_this_time;
 
+		assert(sna->kgem.mode == KGEM_BLT);
 		do {
 			uint32_t *b;
 
@@ -2801,6 +2817,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 			_kgem_submit(kgem);
 			_kgem_set_mode(kgem, KGEM_BLT);
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			b = kgem->batch + kgem->nbatch;
 			b[0] = XY_SETUP_MONO_PATTERN_SL_BLT;
 			if (bpp == 32)
@@ -2917,6 +2934,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 			assert(nbox_this_time);
 			nbox -= nbox_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			do {
 				uint32_t *b = kgem->batch + kgem->nbatch;
 
@@ -2969,6 +2987,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 			assert(nbox_this_time);
 			nbox -= nbox_this_time;
 
+			assert(sna->kgem.mode == KGEM_BLT);
 			do {
 				uint32_t *b = kgem->batch + kgem->nbatch;
 
@@ -3015,6 +3034,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 		_kgem_submit(kgem);
 	} else if (kgem->gen >= 060 && src_bo == dst_bo && kgem_check_batch(kgem, 3)) {
 		uint32_t *b = kgem->batch + kgem->nbatch;
+		assert(sna->kgem.mode == KGEM_BLT);
 		b[0] = XY_SETUP_CLIP;
 		b[1] = b[2] = 0;
 		kgem->nbatch += 3;
commit c6b0e3fe0c299488932ba0392847f1faf298d079
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 30 11:52:05 2013 +0000

    sna: Detect and handle mi recursion
    
    Some of the mi routines recuse back into the generic accel routines and
    so confuse our trapping of SIGBUS. Add extra assertions to pinpoint the
    recursion and unwrap sufficiently to avoid that recursion.
    
    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 bd1f376..f8a3e48 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -333,6 +333,8 @@ static void assert_pixmap_damage(PixmapPtr p)
 	struct sna_pixmap *priv;
 	RegionRec reg, cpu, gpu;
 
+	sigtrap_assert();
+
 	priv = sna_pixmap(p);
 	if (priv == NULL)
 		return;
@@ -4205,6 +4207,7 @@ try_upload_blt(PixmapPtr pixmap, RegionRec *region,
 	     __FUNCTION__, x, y, w, h,
 	     RegionNumRects(region)));
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		ok = sna->render.copy_boxes(sna, GXcopy,
 					    pixmap, src_bo, -x, -y,
@@ -4319,6 +4322,7 @@ try_upload_tiled_x(PixmapPtr pixmap, RegionRec *region,
 
 	DBG(("%s: upload(%d, %d, %d, %d) x %d\n", __FUNCTION__, x, y, w, h, n));
 
+	sigtrap_assert();
 	if (sigtrap_get())
 		return false;
 
@@ -4411,6 +4415,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 					     region, MOVE_WRITE))
 		return false;
 
+	sigtrap_assert();
 	if (sigtrap_get())
 		return false;
 
@@ -4539,6 +4544,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 			break;
 
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			int src_stride = BitmapBytePad(w);
 			uint8_t *dst = ptr;
@@ -4674,6 +4680,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 			if (!upload)
 				break;
 
+			sigtrap_assert();
 			if (sigtrap_get() == 0) {
 				int src_stride = BitmapBytePad(w);
 				uint8_t *src = (uint8_t*)bits + (box->y1 - y) * src_stride + bx1/8;
@@ -4833,9 +4840,11 @@ fallback:
 					      drawable_gc_flags(drawable, gc, false)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbPutImage(%d, %d, %d, %d)\n",
 		     __FUNCTION__, x, y, w, h));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPutImage(drawable, gc, depth, x, y, w, h, left, format, bits);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -5078,6 +5087,7 @@ fallback:
 			goto free_boxes;
 
 		if (alu == GXcopy && pixmap->drawable.bitsPerPixel >= 8) {
+			sigtrap_assert();
 			if (sigtrap_get() == 0) {
 				FbBits *dst_bits, *src_bits;
 				int stride = pixmap->devKind;
@@ -5101,6 +5111,7 @@ fallback:
 			if (gc && !sna_gc_move_to_cpu(gc, dst, region))
 				goto out;
 
+			sigtrap_assert();
 			if (sigtrap_get() == 0) {
 				get_drawable_deltas(src, pixmap, &tx, &ty);
 				miCopyRegion(src, dst, gc,
@@ -6051,8 +6062,10 @@ fallback:
 
 			RegionTranslate(region, -dst_dx, -dst_dy);
 
+			sigtrap_assert();
 			if (sna_gc_move_to_cpu(gc, dst, region) &&
 			    sigtrap_get() == 0) {
+				assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 				miCopyRegion(src, dst, gc,
 					     region, dx, dy,
 					     fbCopyNtoN, 0, NULL);
@@ -6228,7 +6241,9 @@ sna_fallback_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 			goto out;
 	}
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		miCopyRegion(src, dst, gc,
 			     region, dx, dy,
 			     fbCopyNtoN, 0, NULL);
@@ -7264,8 +7279,10 @@ fallback:
 					     drawable_gc_flags(drawable, gc, n > 1)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbFillSpans\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbFillSpans(drawable, gc, n, pt, width, sorted);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -7305,8 +7322,10 @@ fallback:
 					     drawable_gc_flags(drawable, gc, n > 1)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbSetSpans\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbSetSpans(drawable, gc, src, pt, width, n, sorted);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -7440,6 +7459,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
 			if (!upload)
 				break;
 
+			sigtrap_assert();
 			if (sigtrap_get() == 0) {
 				b = sna->kgem.batch + sna->kgem.nbatch;
 
@@ -7567,6 +7587,7 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
 		if (!upload)
 			break;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			uint32_t *b;
 
@@ -7817,15 +7838,30 @@ fallback:
 					     drawable_gc_flags(dst, gc, false)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
+		bool expose = gc->fExpose;
+
 		DBG(("%s: fbCopyPlane(%d, %d, %d, %d, %d,%d) %x\n",
 		     __FUNCTION__, src_x, src_y, w, h, dst_x, dst_y, (unsigned)bit));
-		ret = miDoCopy(src, dst, gc,
-			       src_x, src_y, w, h, dst_x, dst_y,
-			       src->bitsPerPixel > 1 ? fbCopyNto1 : fbCopy1toN,
-			       bit, 0);
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
+
+		expose = gc->fExpose;
+		gc->fExpose = 0;
+
+		miDoCopy(src, dst, gc,
+			 src_x, src_y, w, h, dst_x, dst_y,
+			 src->bitsPerPixel > 1 ? fbCopyNto1 : fbCopy1toN,
+			 bit, 0);
+
 		FALLBACK_FLUSH(dst);
 		sigtrap_put();
+
+		gc->fExpose = expose;
+		ret = miHandleExposures(src, dst, gc,
+					src_x, src_y,
+					w, h,
+					dst_x, dst_y, bit);
 	}
 out:
 	sna_gc_move_to_gpu(gc);
@@ -8029,8 +8065,10 @@ fallback:
 					     MOVE_READ | MOVE_WRITE))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbPolyPoint\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolyPoint(drawable, gc, mode, n, pt, flags);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -9070,8 +9108,10 @@ fallback:
 							       !(data.flags & 4 && n == 2))))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbPolyLine\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolyLine(drawable, gc, mode, n, pt);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -9918,8 +9958,10 @@ fallback:
 							       !(data.flags & 4 && n == 1))))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fbPolySegment\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolySegment(drawable, gc, n, seg);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -10526,8 +10568,10 @@ fallback:
 					     drawable_gc_flags(drawable, gc, true)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: miPolyRectangle\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		miPolyRectangle(drawable, gc, n, r);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -10725,8 +10769,10 @@ fallback:
 					     drawable_gc_flags(drawable, gc, true)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s -- fbPolyArc\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolyArc(drawable, gc, n, arc);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -11078,9 +11124,11 @@ fallback:
 					     drawable_gc_flags(draw, gc, true)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback -- miFillPolygon -> sna_fill_spans__cpu\n",
 		     __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		miFillPolygon(draw, gc, shape, mode, n, pt);
 		sigtrap_put();
 	}
@@ -11108,6 +11156,12 @@ sna_pixmap_get_source_bo(PixmapPtr pixmap)
 		if (upload == NULL)
 			return NULL;
 
+		sigtrap_assert();
+		if (sigtrap_get()) {
+			kgem_bo_destroy(&sna->kgem, upload);
+			return NULL;
+		}
+
 		assert(has_coherent_ptr(sna, sna_pixmap(pixmap), MOVE_READ));
 		memcpy_blt(pixmap->devPrivate.ptr, ptr,
 			   pixmap->drawable.bitsPerPixel,
@@ -11116,6 +11170,7 @@ sna_pixmap_get_source_bo(PixmapPtr pixmap)
 			   0, 0,
 			   pixmap->drawable.width,
 			   pixmap->drawable.height);
+		sigtrap_put();
 
 		return upload;
 	}
@@ -12195,6 +12250,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 				if (!upload)
 					break;
 
+				sigtrap_assert();
 				if (sigtrap_get() == 0) {
 					dst = ptr;
 					src_stride = stipple->devKind;
@@ -12342,6 +12398,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 					if (!upload)
 						break;
 
+					sigtrap_assert();
 					if (sigtrap_get() == 0) {
 						dst = ptr;
 						src_stride = stipple->devKind;
@@ -12490,6 +12547,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 						if (!upload)
 							break;
 
+						sigtrap_assert();
 						if (sigtrap_get() == 0) {
 							dst = ptr;
 							src_stride = stipple->devKind;
@@ -13362,8 +13420,10 @@ fallback:
 					     drawable_gc_flags(draw, gc, n > 1)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback - fbPolyFillRect\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolyFillRect(draw, gc, n, rect);
 		FALLBACK_FLUSH(draw);
 		sigtrap_put();
@@ -13532,9 +13592,11 @@ fallback:
 					     drawable_gc_flags(draw, gc, true)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback -- miPolyFillArc -> sna_fill_spans__cpu\n",
 		     __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		miPolyFillArc(draw, gc, n, arc);
 		sigtrap_put();
 	}
@@ -14025,8 +14087,10 @@ fallback:
 						     MOVE_READ | MOVE_WRITE))
 			goto out;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__));
+			assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 			fbPolyGlyphBlt(drawable, gc, x, y, n,
 				       info, FONTGLYPHS(gc->font));
 			FALLBACK_FLUSH(drawable);
@@ -14101,8 +14165,10 @@ fallback:
 						     MOVE_READ | MOVE_WRITE))
 			goto out;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__));
+			assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 			fbPolyGlyphBlt(drawable, gc, x, y, n,
 				       info, FONTGLYPHS(gc->font));
 			FALLBACK_FLUSH(drawable);
@@ -14184,8 +14250,10 @@ fallback:
 		if (!sna_drawable_move_region_to_cpu(drawable, &region, MOVE_WRITE))
 			goto out;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__));
+			assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 			fbImageGlyphBlt(drawable, gc, x, y, n,
 					info, FONTGLYPHS(gc->font));
 			FALLBACK_FLUSH(drawable);
@@ -14267,8 +14335,10 @@ fallback:
 		if (!sna_drawable_move_region_to_cpu(drawable, &region, MOVE_WRITE))
 			goto out;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__));
+			assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 			fbImageGlyphBlt(drawable, gc, x, y, n,
 					info, FONTGLYPHS(gc->font));
 			FALLBACK_FLUSH(drawable);
@@ -14596,8 +14666,10 @@ fallback:
 	if (!sna_drawable_move_region_to_cpu(drawable, &region, MOVE_WRITE))
 		goto out_gc;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbImageGlyphBlt(drawable, gc, x, y, n, info, base);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -14677,8 +14749,10 @@ fallback:
 					     MOVE_READ | MOVE_WRITE))
 		goto out_gc;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPolyGlyphBlt(drawable, gc, x, y, n, info, base);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -14761,6 +14835,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
 		if (!upload)
 			break;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			uint8_t *dst = ptr;
 
@@ -14866,9 +14941,11 @@ sna_push_pixels(GCPtr gc, PixmapPtr bitmap, DrawablePtr drawable,
 					     drawable_gc_flags(drawable, gc, false)))
 		goto out;
 
+	sigtrap_assert();
 	if (sigtrap_get() == 0) {
 		DBG(("%s: fallback, fbPushPixels(%d, %d, %d %d)\n",
 		     __FUNCTION__, w, h, x, y));
+		assert(gc->ops == (GCOps *)&sna_gc_ops__cpu);
 		fbPushPixels(gc, bitmap, drawable, w, h, x, y);
 		FALLBACK_FLUSH(drawable);
 		sigtrap_put();
@@ -14901,12 +14978,43 @@ static const GCOps sna_gc_ops = {
 	sna_push_pixels,
 };
 
+static RegionPtr
+sna_copy_plane__cpu(DrawablePtr src, DrawablePtr dst, GCPtr gc,
+		    int src_x, int src_y,
+		    int w, int h,
+		    int dst_x, int dst_y,
+		    unsigned long bit)
+{
+	DBG(("%s: src=(%d, %d), dst=(%d, %d), size=%dx%d\n", __FUNCTION__,
+	     src_x, src_y, dst_x, dst_y, w, h));
+
+	if (gc->planemask == 0)
+		goto empty;
+
+	if (src->bitsPerPixel == 1 && (bit&1) == 0)
+		goto empty;
+
+	if (!sna_drawable_move_to_cpu(src, MOVE_READ))
+		goto empty;
+
+	return miDoCopy(src, dst, gc,
+			src_x, src_y, w, h, dst_x, dst_y,
+			src->bitsPerPixel > 1 ? fbCopyNto1 : fbCopy1toN,
+			bit, 0);
+
+empty:
+	return miHandleExposures(src, dst, gc,
+				 src_x, src_y,
+				 w, h,
+				 dst_x, dst_y, bit);
+}
+
 static const GCOps sna_gc_ops__cpu = {
 	fbFillSpans,
 	fbSetSpans,
 	fbPutImage,
 	fbCopyArea,
-	fbCopyPlane,
+	sna_copy_plane__cpu,
 	sna_poly_point__cpu,
 	fbPolyLine,
 	fbPolySegment,
@@ -14960,6 +15068,25 @@ sna_validate_gc(GCPtr gc, unsigned long changes, DrawablePtr drawable)
 	sna_gc(gc)->changes |= changes;
 }
 
+static void
+sna_validate_gc__cpu(GCPtr gc, unsigned long changes, DrawablePtr drawable)
+{
+	struct sna_gc *sgc;
+
+	DBG(("%s changes=%lx\n", __FUNCTION__, changes));
+
+	if (changes & (GCClipXOrigin | GCClipYOrigin | GCClipMask | GCSubwindowMode) ||
+	    drawable->serialNumber != (gc->serialNumber & DRAWABLE_SERIAL_BITS))
+		miComputeCompositeClip(gc, drawable);
+
+	fbValidateGC(gc, changes, drawable);
+	gc->serialNumber = drawable->serialNumber;
+
+	sgc = sna_gc(gc);
+	sgc->serial = drawable->serialNumber;
+	sgc->changes = 0;
+}
+
 static const GCFuncs sna_gc_funcs = {
 	sna_validate_gc,
 	miChangeGC,
@@ -14971,7 +15098,7 @@ static const GCFuncs sna_gc_funcs = {
 };
 
 static const GCFuncs sna_gc_funcs__cpu = {
-	fbValidateGC,
+	sna_validate_gc__cpu,
 	miChangeGC,
 	miCopyGC,
 	miDestroyGC,
@@ -14991,8 +15118,13 @@ static int sna_create_gc(GCPtr gc)
 
 	fb_gc(gc)->bpp = bits_per_pixel(gc->depth);
 
-	gc->funcs = (GCFuncs *)&sna_gc_funcs;
-	gc->ops = (GCOps *)&sna_gc_ops;
+	if (gc->depth < 8) {
+		gc->funcs = (GCFuncs *)&sna_gc_funcs__cpu;
+		gc->ops = (GCOps *)&sna_gc_ops__cpu;
+	} else {
+		gc->funcs = (GCFuncs *)&sna_gc_funcs;
+		gc->ops = (GCOps *)&sna_gc_ops;
+	}
 	return true;
 }
 
@@ -15289,6 +15421,7 @@ sna_copy_window(WindowPtr win, DDXPointRec origin, RegionPtr src)
 		if (!sna_pixmap_move_to_cpu(pixmap, MOVE_READ | MOVE_WRITE))
 			return;
 
+		sigtrap_assert();
 		if (sigtrap_get() == 0) {
 			miCopyRegion(&pixmap->drawable, &pixmap->drawable,
 				     0, &dst, dx, dy, fbCopyNtoN, 0, NULL);
@@ -15611,6 +15744,7 @@ fallback:
 			if (!sna_pixmap_move_to_cpu(dst, MOVE_READ | MOVE_WRITE | MOVE_INPLACE_HINT))
 				goto skip;
 
+			sigtrap_assert();
 			if (sigtrap_get() == 0) {
 				assert(src->drawable.bitsPerPixel == dst->drawable.bitsPerPixel);
 				do {
commit 4d13d52258702f2581ca4f695b69e4dc8f510581
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 30 10:02:28 2013 +0000

    sna: Queue retirement when placing a BO on the deferred flushing list
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 6afbec7..7c0ad11 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2183,6 +2183,7 @@ static bool __kgem_retire_rq(struct kgem *kgem, struct kgem_request *rq)
 			     __FUNCTION__, bo->handle));
 			list_add(&bo->request, &kgem->flushing);
 			bo->rq = MAKE_REQUEST(kgem, RQ_RING(bo->rq));
+			kgem->need_retire = true;
 			continue;
 		}
 
@@ -2710,6 +2711,7 @@ void kgem_reset(struct kgem *kgem)
 				assert(bo->domain == DOMAIN_GPU || bo->domain == DOMAIN_NONE);
 				list_add(&bo->request, &kgem->flushing);
 				bo->rq = (void *)kgem;
+				kgem->need_retire = true;
 			} else
 				__kgem_bo_clear_busy(bo);
 
@@ -3952,6 +3954,7 @@ __kgem_bo_create_as_display(struct kgem *kgem, int size, int tiling, int pitch)
 		assert(bo->exec == NULL);
 		list_add(&bo->request, &kgem->flushing);
 		bo->rq = (void *)kgem;
+		kgem->need_retire = true;
 	}
 
 	assert_tiling(kgem, bo);
commit 59531ba31aa479497cb76b67ea972d1cfa6aec79
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Oct 30 09:55:57 2013 +0000

    sna: Check for wedged after submitting
    
    If we submit prior to an operation, check that we didn't just wedge the
    GPU.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index a0ba8ca..1a4c36a 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -2809,7 +2809,8 @@ gen2_render_fill_boxes(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+			return false;
 	}
 
 	gen2_emit_fill_composite_state(sna, &tmp, pixel);
@@ -3040,10 +3041,13 @@ gen2_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 
 	if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
 		kgem_submit(&sna->kgem);
+
 		if (gen2_render_fill_one_try_blt(sna, dst, bo, color,
 						 x1, y1, x2, y2, alu))
 			return true;
-		assert(kgem_check_bo(&sna->kgem, bo, NULL));
+
+		if (!kgem_check_bo(&sna->kgem, bo, NULL))
+			return false;
 	}
 
 	tmp.op = alu;
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index cec35f4..dc20c02 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -5949,7 +5949,8 @@ gen3_render_fill_boxes(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+			return false;
 	}
 
 	gen3_align_vertex(sna, &tmp);
@@ -6095,7 +6096,8 @@ gen3_render_fill(struct sna *sna, uint8_t alu,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+			return false;
 	}
 
 	tmp->blt   = gen3_render_fill_op_blt;
@@ -6176,9 +6178,13 @@ gen3_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 
 	if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
 		kgem_submit(&sna->kgem);
+
 		if (gen3_render_fill_one_try_blt(sna, dst, bo, color,
 						 x1, y1, x2, y2, alu))
 			return true;
+
+		if (!kgem_check_bo(&sna->kgem, bo, NULL))
+			return false;
 	}
 
 	gen3_align_vertex(sna, &tmp);
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index f737c33..5d95991 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1388,7 +1388,8 @@ gen4_render_video(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+			return false;
 	}
 
 	gen4_align_vertex(sna, &tmp);
@@ -2656,7 +2657,8 @@ gen4_render_fill_boxes(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL))
+			return false;
 	}
 
 	gen4_align_vertex(sna, &tmp);
@@ -2761,7 +2763,10 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+			kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+			return false;
+		}
 	}
 
 	gen4_align_vertex(sna, &op->base);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index f9dd6ae..e20b0d0 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1386,7 +1386,8 @@ gen5_render_video(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+			return false;
 	}
 
 	gen5_align_vertex(sna, &tmp);
@@ -2686,7 +2687,10 @@ gen5_render_fill_boxes(struct sna *sna,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
+			return false;
+		}
 	}
 
 	gen5_align_vertex(sna, &tmp);
@@ -2856,7 +2860,10 @@ gen5_render_fill(struct sna *sna, uint8_t alu,
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+			kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+			return false;
+		}
 	}
 
 	gen5_align_vertex(sna, &op->base);
@@ -2951,7 +2958,6 @@ gen5_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
 			return false;
 		}
-		assert(kgem_check_bo(&sna->kgem, bo, NULL));
 	}
 
 	gen5_align_vertex(sna, &tmp);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index d597e17..b8c46c0 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1868,7 +1868,9 @@ gen7_render_video(struct sna *sna,
 	kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp.dst.bo);
 	if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL))
+			return false;
+
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
 	}
 
@@ -3327,7 +3329,12 @@ gen7_render_fill_boxes(struct sna *sna,
 	kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
+			if (tmp.redirect.real_bo)
+				kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
+			return false;
+		}
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
 	}
 
@@ -3502,7 +3509,11 @@ gen7_render_fill(struct sna *sna, uint8_t alu,
 	kgem_set_mode(&sna->kgem, KGEM_RENDER, dst_bo);
 	if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
+		if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
+			kgem_bo_destroy(&sna->kgem, op->base.src.bo);
+			return false;
+		}
+
 		_kgem_set_mode(&sna->kgem, KGEM_RENDER);
 	}
 
@@ -3581,7 +3592,7 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
 	kgem_set_mode(&sna->kgem, KGEM_RENDER, bo);
 	if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		if (kgem_check_bo(&sna->kgem, bo, NULL)) {
+		if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
 			kgem_bo_destroy(&sna->kgem, tmp.src.bo);
 			return false;
 		}
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4606dc7..6afbec7 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4717,6 +4717,9 @@ static bool aperture_check(struct kgem *kgem, unsigned num_pages)
 
 static inline bool kgem_flush(struct kgem *kgem, bool flush)
 {
+	if (unlikely(kgem->wedged))
+		return false;
+
 	if (kgem->nreloc == 0)
 		return true;
 
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 277f53e..94486bc 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -173,6 +173,8 @@ static bool sna_blt_fill_init(struct sna *sna,
 
 		if (!kgem_check_reloc(kgem, 1)) {
 			_kgem_submit(kgem);
+			if (!kgem_check_bo_fenced(kgem, bo))
+				return false;
 			_kgem_set_mode(kgem, KGEM_BLT);
 		}
 
@@ -2734,6 +2736,8 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 
 		if (!kgem_check_reloc(kgem, 1)) {
 			_kgem_submit(kgem);
+			if (!kgem_check_bo_fenced(&sna->kgem, bo))
+				return false;
 			_kgem_set_mode(kgem, KGEM_BLT);
 		}
 
commit 87655e7df4847542db8da6c8b61006c95b936185
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Oct 29 21:19:02 2013 +0000

    sna: Wrap access of upload buffers with sigtrap
    
    For an extra layer of paranoia, catch any sigbus when trying to upload
    a bitmap, and convert it to a no-op.
    
    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 a429f73..bd1f376 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4519,9 +4519,6 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		int bw = (bx2 - bx1)/8;
 		int bh = box->y2 - box->y1;
 		int bstride = ALIGN(bw, 2);
-		int src_stride;
-		uint8_t *dst, *src;
-		uint32_t *b;
 		struct kgem_bo *upload;
 		void *ptr;
 
@@ -4541,50 +4538,56 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		if (!upload)
 			break;
 
-		dst = ptr;
-		bstride -= bw;
 
-		src_stride = BitmapBytePad(w);
-		src = (uint8_t*)bits + (box->y1 - y) * src_stride + bx1/8;
-		src_stride -= bw;
-		do {
-			int i = bw;
-			assert(src >= (uint8_t *)bits);
+		if (sigtrap_get() == 0) {
+			int src_stride = BitmapBytePad(w);
+			uint8_t *dst = ptr;
+			uint8_t *src = (uint8_t*)bits + (box->y1 - y) * src_stride + bx1/8;
+			uint32_t *b;
+
+			bstride -= bw;
+			src_stride -= bw;
+
 			do {
-				*dst++ = byte_reverse(*src++);
-			} while (--i);
-			assert(src <= (uint8_t *)bits + BitmapBytePad(w) * h);
-			assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
-			dst += bstride;
-			src += src_stride;
-		} while (--bh);
+				int i = bw;
+				assert(src >= (uint8_t *)bits);
+				do {
+					*dst++ = byte_reverse(*src++);
+				} while (--i);
+				assert(src <= (uint8_t *)bits + BitmapBytePad(w) * h);
+				assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
+				dst += bstride;
+				src += src_stride;
+			} while (--bh);
 
-		b = sna->kgem.batch + sna->kgem.nbatch;
-		b[0] = XY_MONO_SRC_COPY | 3 << 20;
-		b[0] |= ((box->x1 - x) & 7) << 17;
-		b[1] = bo->pitch;
-		if (sna->kgem.gen >= 040 && bo->tiling) {
-			b[0] |= BLT_DST_TILED;
-			b[1] >>= 2;
-		}
-		b[1] |= blt_depth(drawable->depth) << 24;
-		b[1] |= rop << 16;
-		b[2] = box->y1 << 16 | box->x1;
-		b[3] = box->y2 << 16 | box->x2;
-		b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, bo,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      I915_GEM_DOMAIN_RENDER |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-				      upload,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[6] = gc->bgPixel;
-		b[7] = gc->fgPixel;
+			b = sna->kgem.batch + sna->kgem.nbatch;
+			b[0] = XY_MONO_SRC_COPY | 3 << 20;
+			b[0] |= ((box->x1 - x) & 7) << 17;
+			b[1] = bo->pitch;
+			if (sna->kgem.gen >= 040 && bo->tiling) {
+				b[0] |= BLT_DST_TILED;
+				b[1] >>= 2;
+			}
+			b[1] |= blt_depth(drawable->depth) << 24;
+			b[1] |= rop << 16;
+			b[2] = box->y1 << 16 | box->x1;
+			b[3] = box->y2 << 16 | box->x2;
+			b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, bo,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      I915_GEM_DOMAIN_RENDER |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+					      upload,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[6] = gc->bgPixel;
+			b[7] = gc->fgPixel;
 
-		sna->kgem.nbatch += 8;
+			sna->kgem.nbatch += 8;
+			sigtrap_put();
+		}
 		kgem_bo_destroy(&sna->kgem, upload);
 
 		box++;
@@ -4652,9 +4655,6 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 			int bw = (bx2 - bx1)/8;
 			int bh = box->y2 - box->y1;
 			int bstride = ALIGN(bw, 2);
-			int src_stride;
-			uint8_t *dst, *src;
-			uint32_t *b;
 			struct kgem_bo *upload;
 			void *ptr;
 
@@ -4674,56 +4674,60 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 			if (!upload)
 				break;
 
-			dst = ptr;
-			bstride -= bw;
+			if (sigtrap_get() == 0) {
+				int src_stride = BitmapBytePad(w);
+				uint8_t *src = (uint8_t*)bits + (box->y1 - y) * src_stride + bx1/8;
+				uint8_t *dst = ptr;
+				uint32_t *b;
 
-			src_stride = BitmapBytePad(w);
-			src = (uint8_t*)bits + (box->y1 - y) * src_stride + bx1/8;
-			src_stride -= bw;
-			do {
-				int j = bw;
-				assert(src >= (uint8_t *)bits);
+				bstride -= bw;
+				src_stride -= bw;
 				do {
-					*dst++ = byte_reverse(*src++);
-				} while (--j);
-				assert(src <= (uint8_t *)bits + BitmapBytePad(w) * h);
-				assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
-				dst += bstride;
-				src += src_stride;
-			} while (--bh);
+					int j = bw;
+					assert(src >= (uint8_t *)bits);
+					do {
+						*dst++ = byte_reverse(*src++);
+					} while (--j);
+					assert(src <= (uint8_t *)bits + BitmapBytePad(w) * h);
+					assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
+					dst += bstride;
+					src += src_stride;
+				} while (--bh);
 
-			b = sna->kgem.batch + sna->kgem.nbatch;
-			b[0] = XY_FULL_MONO_PATTERN_MONO_SRC_BLT | 3 << 20;
-			b[0] |= ((box->x1 - x) & 7) << 17;
-			b[1] = bo->pitch;
-			if (sna->kgem.gen >= 040 && bo->tiling) {
-				b[0] |= BLT_DST_TILED;
-				b[1] >>= 2;
+				b = sna->kgem.batch + sna->kgem.nbatch;
+				b[0] = XY_FULL_MONO_PATTERN_MONO_SRC_BLT | 3 << 20;
+				b[0] |= ((box->x1 - x) & 7) << 17;
+				b[1] = bo->pitch;
+				if (sna->kgem.gen >= 040 && bo->tiling) {
+					b[0] |= BLT_DST_TILED;
+					b[1] >>= 2;
+				}
+				b[1] |= 1 << 31; /* solid pattern */
+				b[1] |= blt_depth(drawable->depth) << 24;
+				b[1] |= 0xce << 16; /* S or (D and !P) */
+				b[2] = box->y1 << 16 | box->x1;
+				b[3] = box->y2 << 16 | box->x2;
+				b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
+						      bo,
+						      I915_GEM_DOMAIN_RENDER << 16 |
+						      I915_GEM_DOMAIN_RENDER |
+						      KGEM_RELOC_FENCED,
+						      0);
+				b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+						      upload,
+						      I915_GEM_DOMAIN_RENDER << 16 |
+						      KGEM_RELOC_FENCED,
+						      0);
+				b[6] = 0;
+				b[7] = i;
+				b[8] = i;
+				b[9] = i;
+				b[10] = -1;
+				b[11] = -1;
+
+				sna->kgem.nbatch += 12;
+				sigtrap_put();
 			}
-			b[1] |= 1 << 31; /* solid pattern */
-			b[1] |= blt_depth(drawable->depth) << 24;
-			b[1] |= 0xce << 16; /* S or (D and !P) */
-			b[2] = box->y1 << 16 | box->x1;
-			b[3] = box->y2 << 16 | box->x2;
-			b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
-					      bo,
-					      I915_GEM_DOMAIN_RENDER << 16 |
-					      I915_GEM_DOMAIN_RENDER |
-					      KGEM_RELOC_FENCED,
-					      0);
-			b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-					      upload,
-					      I915_GEM_DOMAIN_RENDER << 16 |
-					      KGEM_RELOC_FENCED,
-					      0);
-			b[6] = 0;
-			b[7] = i;
-			b[8] = i;
-			b[9] = i;
-			b[10] = -1;
-			b[11] = -1;
-
-			sna->kgem.nbatch += 12;
 			kgem_bo_destroy(&sna->kgem, upload);
 
 			box++;
@@ -7436,45 +7440,50 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc,
 			if (!upload)
 				break;
 
-			b = sna->kgem.batch + sna->kgem.nbatch;
-			b[0] = XY_MONO_SRC_COPY | br00;
-			b[0] |= ((box->x1 + sx) & 7) << 17;
-			b[1] = br13;
-			b[2] = (box->y1 + dy) << 16 | (box->x1 + dx);
-			b[3] = (box->y2 + dy) << 16 | (box->x2 + dx);
-			b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
-					      arg->bo,
-					      I915_GEM_DOMAIN_RENDER << 16 |
-					      I915_GEM_DOMAIN_RENDER |
-					      KGEM_RELOC_FENCED,
-					      0);
-			b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-					      upload,
-					      I915_GEM_DOMAIN_RENDER << 16 |
-					      KGEM_RELOC_FENCED,
-					      0);
-			b[6] = gc->bgPixel;
-			b[7] = gc->fgPixel;
+			if (sigtrap_get() == 0) {
+				b = sna->kgem.batch + sna->kgem.nbatch;
 
-			sna->kgem.nbatch += 8;
+				b[0] = XY_MONO_SRC_COPY | br00;
+				b[0] |= ((box->x1 + sx) & 7) << 17;
+				b[1] = br13;
+				b[2] = (box->y1 + dy) << 16 | (box->x1 + dx);
+				b[3] = (box->y2 + dy) << 16 | (box->x2 + dx);
+				b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
+						      arg->bo,
+						      I915_GEM_DOMAIN_RENDER << 16 |
+						      I915_GEM_DOMAIN_RENDER |
+						      KGEM_RELOC_FENCED,
+						      0);
+				b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+						      upload,
+						      I915_GEM_DOMAIN_RENDER << 16 |
+						      KGEM_RELOC_FENCED,
+						      0);
+				b[6] = gc->bgPixel;
+				b[7] = gc->fgPixel;
 
-			dst = ptr;
-			src_stride = bitmap->devKind;
-			src = bitmap->devPrivate.ptr;
-			src += (box->y1 + sy) * src_stride + bx1/8;
-			src_stride -= bstride;
-			do {
-				int i = bstride;
-				assert(src >= (uint8_t *)bitmap->devPrivate.ptr);
+				sna->kgem.nbatch += 8;
+
+				dst = ptr;
+				src_stride = bitmap->devKind;
+				src = bitmap->devPrivate.ptr;
+				src += (box->y1 + sy) * src_stride + bx1/8;
+				src_stride -= bstride;
 				do {
-					*dst++ = byte_reverse(*src++);
-					*dst++ = byte_reverse(*src++);
-					i -= 2;
-				} while (i);
-				assert(src <= (uint8_t *)bitmap->devPrivate.ptr + bitmap->devKind * bitmap->drawable.height);
-				assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
-				src += src_stride;
-			} while (--bh);
+					int i = bstride;
+					assert(src >= (uint8_t *)bitmap->devPrivate.ptr);
+					do {
+						*dst++ = byte_reverse(*src++);
+						*dst++ = byte_reverse(*src++);
+						i -= 2;
+					} while (i);
+					assert(src <= (uint8_t *)bitmap->devPrivate.ptr + bitmap->devKind * bitmap->drawable.height);
+					assert(dst <= (uint8_t *)ptr + kgem_bo_size(upload));
+					src += src_stride;
+				} while (--bh);
+
+				sigtrap_put();
+			}
 
 			kgem_bo_destroy(&sna->kgem, upload);
 		}
@@ -7533,7 +7542,6 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
 		int bw = (bx2 - bx1)/8;
 		int bh = box->y2 - box->y1;
 		int bstride = ALIGN(bw, 2);
-		uint32_t *b;
 		struct kgem_bo *upload;
 		void *ptr;
 
@@ -7559,130 +7567,135 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr drawable, GCPtr gc,
 		if (!upload)
 			break;
 
-		switch (source->bitsPerPixel) {
-		case 32:
-			{
-				uint32_t *src = src_pixmap->devPrivate.ptr;
-				int src_stride = src_pixmap->devKind/sizeof(uint32_t);
-				uint8_t *dst = ptr;
+		if (sigtrap_get() == 0) {
+			uint32_t *b;
 
-				src += (box->y1 + sy) * src_stride;
-				src += bx1;
+			switch (source->bitsPerPixel) {
+			case 32:
+				{
+					uint32_t *src = src_pixmap->devPrivate.ptr;
+					int src_stride = src_pixmap->devKind/sizeof(uint32_t);
+					uint8_t *dst = ptr;
 
-				src_stride -= bw * 8;
-				bstride -= bw;
+					src += (box->y1 + sy) * src_stride;
+					src += bx1;
+
+					src_stride -= bw * 8;
+					bstride -= bw;
 
-				do {
-					int i = bw;
 					do {
-						uint8_t v = 0;
-
-						v |= ((*src++ >> bit) & 1) << 7;
-						v |= ((*src++ >> bit) & 1) << 6;
-						v |= ((*src++ >> bit) & 1) << 5;
-						v |= ((*src++ >> bit) & 1) << 4;
-						v |= ((*src++ >> bit) & 1) << 3;
-						v |= ((*src++ >> bit) & 1) << 2;
-						v |= ((*src++ >> bit) & 1) << 1;
-						v |= ((*src++ >> bit) & 1) << 0;
-
-						*dst++ = v;
-					} while (--i);
-					dst += bstride;
-					src += src_stride;
-				} while (--bh);
-				break;
-			}
-		case 16:
-			{
-				uint16_t *src = src_pixmap->devPrivate.ptr;
-				int src_stride = src_pixmap->devKind/sizeof(uint16_t);
-				uint8_t *dst = ptr;
+						int i = bw;
+						do {
+							uint8_t v = 0;
+
+							v |= ((*src++ >> bit) & 1) << 7;
+							v |= ((*src++ >> bit) & 1) << 6;
+							v |= ((*src++ >> bit) & 1) << 5;
+							v |= ((*src++ >> bit) & 1) << 4;
+							v |= ((*src++ >> bit) & 1) << 3;
+							v |= ((*src++ >> bit) & 1) << 2;
+							v |= ((*src++ >> bit) & 1) << 1;
+							v |= ((*src++ >> bit) & 1) << 0;
+
+							*dst++ = v;
+						} while (--i);
+						dst += bstride;
+						src += src_stride;
+					} while (--bh);
+					break;
+				}
+			case 16:
+				{
+					uint16_t *src = src_pixmap->devPrivate.ptr;
+					int src_stride = src_pixmap->devKind/sizeof(uint16_t);
+					uint8_t *dst = ptr;
 
-				src += (box->y1 + sy) * src_stride;
-				src += bx1;
+					src += (box->y1 + sy) * src_stride;
+					src += bx1;
 
-				src_stride -= bw * 8;
-				bstride -= bw;
+					src_stride -= bw * 8;
+					bstride -= bw;
 
-				do {
-					int i = bw;
 					do {
-						uint8_t v = 0;
-
-						v |= ((*src++ >> bit) & 1) << 7;
-						v |= ((*src++ >> bit) & 1) << 6;
-						v |= ((*src++ >> bit) & 1) << 5;
-						v |= ((*src++ >> bit) & 1) << 4;
-						v |= ((*src++ >> bit) & 1) << 3;
-						v |= ((*src++ >> bit) & 1) << 2;
-						v |= ((*src++ >> bit) & 1) << 1;
-						v |= ((*src++ >> bit) & 1) << 0;
-
-						*dst++ = v;
-					} while (--i);
-					dst += bstride;
-					src += src_stride;
-				} while (--bh);
-				break;
-			}
-		default:
-			assert(0);
-		case 8:
-			{
-				uint8_t *src = src_pixmap->devPrivate.ptr;
-				int src_stride = src_pixmap->devKind/sizeof(uint8_t);
-				uint8_t *dst = ptr;
+						int i = bw;
+						do {
+							uint8_t v = 0;
+
+							v |= ((*src++ >> bit) & 1) << 7;
+							v |= ((*src++ >> bit) & 1) << 6;
+							v |= ((*src++ >> bit) & 1) << 5;
+							v |= ((*src++ >> bit) & 1) << 4;
+							v |= ((*src++ >> bit) & 1) << 3;
+							v |= ((*src++ >> bit) & 1) << 2;
+							v |= ((*src++ >> bit) & 1) << 1;
+							v |= ((*src++ >> bit) & 1) << 0;
+
+							*dst++ = v;
+						} while (--i);
+						dst += bstride;
+						src += src_stride;
+					} while (--bh);
+					break;
+				}
+			default:
+				assert(0);
+			case 8:
+				{
+					uint8_t *src = src_pixmap->devPrivate.ptr;
+					int src_stride = src_pixmap->devKind/sizeof(uint8_t);
+					uint8_t *dst = ptr;
 
-				src += (box->y1 + sy) * src_stride;
-				src += bx1;
+					src += (box->y1 + sy) * src_stride;
+					src += bx1;
 
-				src_stride -= bw * 8;
-				bstride -= bw;
+					src_stride -= bw * 8;
+					bstride -= bw;
 
-				do {
-					int i = bw;
 					do {
-						uint8_t v = 0;
-
-						v |= ((*src++ >> bit) & 1) << 7;
-						v |= ((*src++ >> bit) & 1) << 6;
-						v |= ((*src++ >> bit) & 1) << 5;
-						v |= ((*src++ >> bit) & 1) << 4;
-						v |= ((*src++ >> bit) & 1) << 3;
-						v |= ((*src++ >> bit) & 1) << 2;
-						v |= ((*src++ >> bit) & 1) << 1;
-						v |= ((*src++ >> bit) & 1) << 0;
-
-						*dst++ = v;
-					} while (--i);
-					dst += bstride;
-					src += src_stride;
-				} while (--bh);
-				break;
+						int i = bw;
+						do {
+							uint8_t v = 0;
+
+							v |= ((*src++ >> bit) & 1) << 7;
+							v |= ((*src++ >> bit) & 1) << 6;
+							v |= ((*src++ >> bit) & 1) << 5;
+							v |= ((*src++ >> bit) & 1) << 4;
+							v |= ((*src++ >> bit) & 1) << 3;
+							v |= ((*src++ >> bit) & 1) << 2;
+							v |= ((*src++ >> bit) & 1) << 1;
+							v |= ((*src++ >> bit) & 1) << 0;
+
+							*dst++ = v;
+						} while (--i);
+						dst += bstride;
+						src += src_stride;
+					} while (--bh);
+					break;
+				}
 			}
-		}
 
-		b = sna->kgem.batch + sna->kgem.nbatch;
-		b[0] = br00 | ((box->x1 + sx) & 7) << 17;
-		b[1] = br13;
-		b[2] = (box->y1 + dy) << 16 | (box->x1 + dx);
-		b[3] = (box->y2 + dy) << 16 | (box->x2 + dx);
-		b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
-				      arg->bo,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      I915_GEM_DOMAIN_RENDER |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-				      upload,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[6] = gc->bgPixel;
-		b[7] = gc->fgPixel;
+			b = sna->kgem.batch + sna->kgem.nbatch;
+			b[0] = br00 | ((box->x1 + sx) & 7) << 17;
+			b[1] = br13;
+			b[2] = (box->y1 + dy) << 16 | (box->x1 + dx);
+			b[3] = (box->y2 + dy) << 16 | (box->x2 + dx);
+			b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4,
+					      arg->bo,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      I915_GEM_DOMAIN_RENDER |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+					      upload,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[6] = gc->bgPixel;
+			b[7] = gc->fgPixel;
 
-		sna->kgem.nbatch += 8;
+			sna->kgem.nbatch += 8;
+			sigtrap_put();
+		}
 		kgem_bo_destroy(&sna->kgem, upload);
 
 		box++;
@@ -12182,41 +12195,45 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 				if (!upload)
 					break;
 
-				dst = ptr;
-				src_stride = stipple->devKind;
-				src = stipple->devPrivate.ptr;
-				src += (r->y - origin->y) * src_stride + bx1/8;
-				src_stride -= bstride;
-				do {
-					int i = bstride;
+				if (sigtrap_get() == 0) {
+					dst = ptr;
+					src_stride = stipple->devKind;
+					src = stipple->devPrivate.ptr;
+					src += (r->y - origin->y) * src_stride + bx1/8;
+					src_stride -= bstride;
 					do {
-						*dst++ = byte_reverse(*src++);
-						*dst++ = byte_reverse(*src++);
-						i -= 2;
-					} while (i);
-					src += src_stride;
-				} while (--bh);
-				b = sna->kgem.batch + sna->kgem.nbatch;
-				b[0] = XY_MONO_SRC_COPY | br00;
-				b[0] |= ((r->x - origin->x) & 7) << 17;
-				b[1] = br13;
-				b[2] = (r->y + dy) << 16 | (r->x + dx);
-				b[3] = (r->y + r->height + dy) << 16 | (r->x + r->width + dx);
-				b[4] = kgem_add_reloc(&sna->kgem,
-						      sna->kgem.nbatch + 4, bo,
-						      I915_GEM_DOMAIN_RENDER << 16 |
-						      I915_GEM_DOMAIN_RENDER |
-						      KGEM_RELOC_FENCED,
-						      0);
-				b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-						      upload,
-						      I915_GEM_DOMAIN_RENDER << 16 |
-						      KGEM_RELOC_FENCED,
-						      0);
-				b[6] = gc->bgPixel;
-				b[7] = gc->fgPixel;
+						int i = bstride;
+						do {
+							*dst++ = byte_reverse(*src++);
+							*dst++ = byte_reverse(*src++);
+							i -= 2;
+						} while (i);
+						src += src_stride;
+					} while (--bh);
 
-				sna->kgem.nbatch += 8;
+					b = sna->kgem.batch + sna->kgem.nbatch;
+					b[0] = XY_MONO_SRC_COPY | br00;
+					b[0] |= ((r->x - origin->x) & 7) << 17;
+					b[1] = br13;
+					b[2] = (r->y + dy) << 16 | (r->x + dx);
+					b[3] = (r->y + r->height + dy) << 16 | (r->x + r->width + dx);
+					b[4] = kgem_add_reloc(&sna->kgem,
+							      sna->kgem.nbatch + 4, bo,
+							      I915_GEM_DOMAIN_RENDER << 16 |
+							      I915_GEM_DOMAIN_RENDER |
+							      KGEM_RELOC_FENCED,
+							      0);
+					b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+							      upload,
+							      I915_GEM_DOMAIN_RENDER << 16 |
+							      KGEM_RELOC_FENCED,
+							      0);
+					b[6] = gc->bgPixel;
+					b[7] = gc->fgPixel;
+
+					sna->kgem.nbatch += 8;
+					sigtrap_put();
+				}
 				kgem_bo_destroy(&sna->kgem, upload);
 			}
 
@@ -12325,42 +12342,45 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 					if (!upload)
 						break;
 
-					dst = ptr;
-					src_stride = stipple->devKind;
-					src = stipple->devPrivate.ptr;
-					src += (box.y1 - pat.y) * src_stride + bx1/8;
-					src_stride -= bstride;
-					do {
-						int i = bstride;
+					if (sigtrap_get() == 0) {
+						dst = ptr;
+						src_stride = stipple->devKind;
+						src = stipple->devPrivate.ptr;
+						src += (box.y1 - pat.y) * src_stride + bx1/8;
+						src_stride -= bstride;
 						do {
-							*dst++ = byte_reverse(*src++);
-							*dst++ = byte_reverse(*src++);
-							i -= 2;
-						} while (i);
-						src += src_stride;
-					} while (--bh);
+							int i = bstride;
+							do {
+								*dst++ = byte_reverse(*src++);
+								*dst++ = byte_reverse(*src++);
+								i -= 2;
+							} while (i);
+							src += src_stride;
+						} while (--bh);
 
-					b = sna->kgem.batch + sna->kgem.nbatch;
-					b[0] = XY_MONO_SRC_COPY | br00;
-					b[0] |= ((box.x1 - pat.x) & 7) << 17;
-					b[1] = br13;
-					b[2] = (box.y1 + dy) << 16 | (box.x1 + dx);
-					b[3] = (box.y2 + dy) << 16 | (box.x2 + dx);
-					b[4] = kgem_add_reloc(&sna->kgem,
-							      sna->kgem.nbatch + 4, bo,
-							      I915_GEM_DOMAIN_RENDER << 16 |
-							      I915_GEM_DOMAIN_RENDER |
-							      KGEM_RELOC_FENCED,
-							      0);
-					b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-							      upload,
-							      I915_GEM_DOMAIN_RENDER << 16 |
-							      KGEM_RELOC_FENCED,
-							      0);
-					b[6] = gc->bgPixel;
-					b[7] = gc->fgPixel;
+						b = sna->kgem.batch + sna->kgem.nbatch;
+						b[0] = XY_MONO_SRC_COPY | br00;
+						b[0] |= ((box.x1 - pat.x) & 7) << 17;
+						b[1] = br13;
+						b[2] = (box.y1 + dy) << 16 | (box.x1 + dx);
+						b[3] = (box.y2 + dy) << 16 | (box.x2 + dx);
+						b[4] = kgem_add_reloc(&sna->kgem,
+								      sna->kgem.nbatch + 4, bo,
+								      I915_GEM_DOMAIN_RENDER << 16 |
+								      I915_GEM_DOMAIN_RENDER |
+								      KGEM_RELOC_FENCED,
+								      0);
+						b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+								      upload,
+								      I915_GEM_DOMAIN_RENDER << 16 |
+								      KGEM_RELOC_FENCED,
+								      0);
+						b[6] = gc->bgPixel;
+						b[7] = gc->fgPixel;
 
-					sna->kgem.nbatch += 8;
+						sna->kgem.nbatch += 8;
+						sigtrap_put();
+					}
 					kgem_bo_destroy(&sna->kgem, upload);
 				}
 			} while (--n);
@@ -12470,42 +12490,45 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
 						if (!upload)
 							break;
 
-						dst = ptr;
-						src_stride = stipple->devKind;
-						src = stipple->devPrivate.ptr;
-						src += (box.y1 - pat.y) * src_stride + bx1/8;
-						src_stride -= bstride;
-						do {
-							int i = bstride;
+						if (sigtrap_get() == 0) {
+							dst = ptr;
+							src_stride = stipple->devKind;
+							src = stipple->devPrivate.ptr;
+							src += (box.y1 - pat.y) * src_stride + bx1/8;
+							src_stride -= bstride;
 							do {
-								*dst++ = byte_reverse(*src++);
-								*dst++ = byte_reverse(*src++);
-								i -= 2;
-							} while (i);
-							src += src_stride;
-						} while (--bh);
+								int i = bstride;
+								do {
+									*dst++ = byte_reverse(*src++);
+									*dst++ = byte_reverse(*src++);
+									i -= 2;
+								} while (i);
+								src += src_stride;
+							} while (--bh);
 
-						b = sna->kgem.batch + sna->kgem.nbatch;
-						b[0] = XY_MONO_SRC_COPY | br00;
-						b[0] |= ((box.x1 - pat.x) & 7) << 17;
-						b[1] = br13;
-						b[2] = (box.y1 + dy) << 16 | (box.x1 + dx);
-						b[3] = (box.y2 + dy) << 16 | (box.x2 + dx);
-						b[4] = kgem_add_reloc(&sna->kgem,
-								      sna->kgem.nbatch + 4, bo,
-								      I915_GEM_DOMAIN_RENDER << 16 |
-								      I915_GEM_DOMAIN_RENDER |
-								      KGEM_RELOC_FENCED,
-								      0);
-						b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-								      upload,
-								      I915_GEM_DOMAIN_RENDER << 16 |
-								      KGEM_RELOC_FENCED,
-								      0);
-						b[6] = gc->bgPixel;
-						b[7] = gc->fgPixel;
+							b = sna->kgem.batch + sna->kgem.nbatch;
+							b[0] = XY_MONO_SRC_COPY | br00;
+							b[0] |= ((box.x1 - pat.x) & 7) << 17;
+							b[1] = br13;
+							b[2] = (box.y1 + dy) << 16 | (box.x1 + dx);
+							b[3] = (box.y2 + dy) << 16 | (box.x2 + dx);
+							b[4] = kgem_add_reloc(&sna->kgem,
+									      sna->kgem.nbatch + 4, bo,
+									      I915_GEM_DOMAIN_RENDER << 16 |
+									      I915_GEM_DOMAIN_RENDER |
+									      KGEM_RELOC_FENCED,
+									      0);
+							b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+									      upload,
+									      I915_GEM_DOMAIN_RENDER << 16 |
+									      KGEM_RELOC_FENCED,
+									      0);
+							b[6] = gc->bgPixel;
+							b[7] = gc->fgPixel;
 
-						sna->kgem.nbatch += 8;
+							sna->kgem.nbatch += 8;
+							sigtrap_put();
+						}
 						kgem_bo_destroy(&sna->kgem, upload);
 					}
 				}
@@ -14719,9 +14742,6 @@ sna_push_pixels_solid_blt(GCPtr gc,
 		int bw = (bx2 - bx1)/8;
 		int bh = box->y2 - box->y1;
 		int bstride = ALIGN(bw, 2);
-		int src_stride;
-		uint8_t *dst, *src;
-		uint32_t *b;
 		struct kgem_bo *upload;
 		void *ptr;
 
@@ -14741,49 +14761,55 @@ sna_push_pixels_solid_blt(GCPtr gc,
 		if (!upload)
 			break;
 
-		dst = ptr;
+		if (sigtrap_get() == 0) {
+			uint8_t *dst = ptr;
 
-		src_stride = bitmap->devKind;
-		src = (uint8_t*)bitmap->devPrivate.ptr;
-		src += (box->y1 - region->extents.y1) * src_stride + bx1/8;
-		src_stride -= bstride;
-		do {
-			int i = bstride;
+			int src_stride = bitmap->devKind;
+			uint8_t *src;
+			uint32_t *b;
+
+			src = (uint8_t*)bitmap->devPrivate.ptr;
+			src += (box->y1 - region->extents.y1) * src_stride + bx1/8;
+			src_stride -= bstride;
 			do {
-				*dst++ = byte_reverse(*src++);
-				*dst++ = byte_reverse(*src++);
-				i -= 2;
-			} while (i);
-			src += src_stride;
-		} while (--bh);
+				int i = bstride;
+				do {
+					*dst++ = byte_reverse(*src++);
+					*dst++ = byte_reverse(*src++);
+					i -= 2;
+				} while (i);
+				src += src_stride;
+			} while (--bh);
 
-		b = sna->kgem.batch + sna->kgem.nbatch;
-		b[0] = XY_MONO_SRC_COPY | 3 << 20;
-		b[0] |= ((box->x1 - region->extents.x1) & 7) << 17;
-		b[1] = bo->pitch;
-		if (sna->kgem.gen >= 040 && bo->tiling) {
-			b[0] |= BLT_DST_TILED;
-			b[1] >>= 2;
-		}
-		b[1] |= 1 << 29;
-		b[1] |= blt_depth(drawable->depth) << 24;
-		b[1] |= rop << 16;
-		b[2] = box->y1 << 16 | box->x1;
-		b[3] = box->y2 << 16 | box->x2;
-		b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, bo,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      I915_GEM_DOMAIN_RENDER |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
-				      upload,
-				      I915_GEM_DOMAIN_RENDER << 16 |
-				      KGEM_RELOC_FENCED,
-				      0);
-		b[6] = gc->bgPixel;
-		b[7] = gc->fgPixel;
+			b = sna->kgem.batch + sna->kgem.nbatch;
+			b[0] = XY_MONO_SRC_COPY | 3 << 20;
+			b[0] |= ((box->x1 - region->extents.x1) & 7) << 17;
+			b[1] = bo->pitch;
+			if (sna->kgem.gen >= 040 && bo->tiling) {
+				b[0] |= BLT_DST_TILED;
+				b[1] >>= 2;
+			}
+			b[1] |= 1 << 29;
+			b[1] |= blt_depth(drawable->depth) << 24;
+			b[1] |= rop << 16;
+			b[2] = box->y1 << 16 | box->x1;
+			b[3] = box->y2 << 16 | box->x2;
+			b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, bo,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      I915_GEM_DOMAIN_RENDER |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[5] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 5,
+					      upload,
+					      I915_GEM_DOMAIN_RENDER << 16 |
+					      KGEM_RELOC_FENCED,
+					      0);
+			b[6] = gc->bgPixel;
+			b[7] = gc->fgPixel;
 
-		sna->kgem.nbatch += 8;
+			sna->kgem.nbatch += 8;
+			sigtrap_put();
+		}
 		kgem_bo_destroy(&sna->kgem, upload);
 
 		box++;


More information about the xorg-commit mailing list