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:
parent
2c78403cb5
commit
ff705331da
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue