xf86-video-intel: src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Jul 21 01:59:32 PDT 2013


 src/sna/sna_accel.c |   41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

New commits:
commit ff705331da62729e302fb882755a88d756d9c233
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jul 21 09:47:35 2013 +0100

    sna: Unwind BLT setup if we don't emit any ops
    
    Often we may find that the BLT operations we wish to do after a
    XY_BLT_SETUP are either completely clipped out or transparent and so do
    not generate any subsequent commands. This leaves us with many unused
    XY_SETUP_BLT.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=61477
    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 96cd73e..bad33d2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -10657,12 +10657,16 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 		} while (1);
 	} else {
 		RegionRec clip;
+		uint16_t unwind_batch, unwind_reloc;
 
 		region_set(&clip, extents);
 		region_maybe_clip(&clip, gc->pCompositeClip);
 		if (RegionNil(&clip))
 			goto done;
 
+		unwind_batch = sna->kgem.nbatch;
+		unwind_reloc = sna->kgem.nreloc;
+
 		b = sna->kgem.batch + sna->kgem.nbatch;
 		b[0] = XY_SETUP_BLT | 3 << 20;
 		b[1] = br13;
@@ -10696,6 +10700,10 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 					if (!kgem_check_batch(&sna->kgem, 3)) {
 						_kgem_submit(&sna->kgem);
 						_kgem_set_mode(&sna->kgem, KGEM_BLT);
+
+						unwind_batch = sna->kgem.nbatch;
+						unwind_reloc = sna->kgem.nreloc;
+
 						b = sna->kgem.batch + sna->kgem.nbatch;
 						b[0] = XY_SETUP_BLT | 3 << 20;
 						b[1] = br13;
@@ -10763,6 +10771,10 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 						if (!kgem_check_batch(&sna->kgem, 3)) {
 							_kgem_submit(&sna->kgem);
 							_kgem_set_mode(&sna->kgem, KGEM_BLT);
+
+							unwind_batch = sna->kgem.nbatch;
+							unwind_reloc = sna->kgem.nreloc;
+
 							b = sna->kgem.batch + sna->kgem.nbatch;
 							b[0] = XY_SETUP_BLT | 3 << 20;
 							b[1] = br13;
@@ -10804,6 +10816,11 @@ sna_poly_fill_rect_tiled_8x8_blt(DrawablePtr drawable,
 				}
 			} while (--n);
 		}
+
+		if (sna->kgem.nbatch == unwind_batch + 8) {
+			sna->kgem.nbatch = unwind_batch;
+			sna->kgem.nreloc = unwind_reloc;
+		}
 	}
 done:
 	assert_pixmap_damage(pixmap);
@@ -12969,6 +12986,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 	uint32_t *b;
 	int16_t dx, dy;
 	uint32_t br00;
+	uint16_t unwind_batch, unwind_reloc;
 
 	uint8_t rop = transparent ? copy_ROP[gc->alu] : ROP_S;
 
@@ -13023,6 +13041,9 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 	     extents->x1, extents->y1,
 	     extents->x2, extents->y2));
 
+	unwind_batch = sna->kgem.nbatch;
+	unwind_reloc = sna->kgem.nreloc;
+
 	b = sna->kgem.batch + sna->kgem.nbatch;
 	b[0] = XY_SETUP_BLT | 3 << 20;
 	b[1] = bo->pitch;
@@ -13086,6 +13107,9 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				     extents->x1, extents->y1,
 				     extents->x2, extents->y2));
 
+				unwind_batch = sna->kgem.nbatch;
+				unwind_reloc = sna->kgem.nreloc;
+
 				b = sna->kgem.batch + sna->kgem.nbatch;
 				b[0] = XY_SETUP_BLT | 3 << 20;
 				b[1] = bo->pitch;
@@ -13156,6 +13180,11 @@ skip:
 		}
 	} while (1);
 
+	if (sna->kgem.nbatch == unwind_batch + 8) {
+		sna->kgem.nbatch = unwind_batch;
+		sna->kgem.nreloc = unwind_reloc;
+	}
+
 	assert_pixmap_damage(pixmap);
 	sna->blt_state.fill_bo = 0;
 	return true;
@@ -13630,6 +13659,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 	uint32_t *b;
 	int16_t dx, dy;
 	uint8_t rop = transparent ? copy_ROP[gc->alu] : ROP_S;
+	uint16_t unwind_batch, unwind_reloc;
 
 	if (bo->tiling == I915_TILING_Y) {
 		DBG(("%s: converting bo from Y-tiling\n", __FUNCTION__));
@@ -13665,6 +13695,9 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 		_kgem_set_mode(&sna->kgem, KGEM_BLT);
 	}
 
+	unwind_batch = sna->kgem.nbatch;
+	unwind_reloc = sna->kgem.nreloc;
+
 	DBG(("%s: glyph clip box (%d, %d), (%d, %d)\n",
 	     __FUNCTION__,
 	     extents->x1, extents->y1,
@@ -13745,6 +13778,9 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 				_kgem_submit(&sna->kgem);
 				_kgem_set_mode(&sna->kgem, KGEM_BLT);
 
+				unwind_batch = sna->kgem.nbatch;
+				unwind_reloc = sna->kgem.nreloc;
+
 				DBG(("%s: new batch, glyph clip box (%d, %d), (%d, %d)\n",
 				     __FUNCTION__,
 				     extents->x1, extents->y1,
@@ -13826,6 +13862,11 @@ skip:
 		}
 	} while (1);
 
+	if (sna->kgem.nbatch == unwind_batch + 8) {
+		sna->kgem.nbatch = unwind_batch;
+		sna->kgem.nreloc = unwind_reloc;
+	}
+
 	assert_pixmap_damage(pixmap);
 	sna->blt_state.fill_bo = 0;
 	return true;


More information about the xorg-commit mailing list