diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-07-21 09:47:35 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-07-21 09:59:07 +0100 |
commit | ff705331da62729e302fb882755a88d756d9c233 (patch) | |
tree | 95e5a816e2cdbad27af57f949d453e6700a671ba | |
parent | 2c78403cb56841f342692b97bb53e995c3ff6b9f (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.c | 41 |
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; |