summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-07-21 09:47:35 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-07-21 09:59:07 +0100
commitff705331da62729e302fb882755a88d756d9c233 (patch)
tree95e5a816e2cdbad27af57f949d453e6700a671ba
parent2c78403cb56841f342692b97bb53e995c3ff6b9f (diff)
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@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_accel.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 96cd73ef..bad33d20 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;