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>
This commit is contained in:
Chris Wilson 2013-07-21 09:47:35 +01:00
parent 2c78403cb5
commit ff705331da
1 changed files with 41 additions and 0 deletions

View File

@ -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;