diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-08 13:27:05 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-08 18:12:04 +0000 |
commit | 576c5169efd068c364fb7d266fbb6b1dd2ad3f4d (patch) | |
tree | 0be39b236aadfc2b8af5e28cc491bbdfcc644fa9 | |
parent | 32bbeefb8563ae2ab3a105d0b1c9b55d9587b788 (diff) |
sna: Tidy sna_copy_bitmap_blt
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 83 |
1 files changed, 37 insertions, 46 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 38e2f2a4..018f4064 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -2775,8 +2775,8 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, PixmapPtr pixmap = get_drawable_pixmap(drawable); struct sna_pixmap *priv = sna_pixmap(pixmap); PixmapPtr bitmap = (PixmapPtr)_bitmap; + uint32_t br00, br13; int16_t dx, dy; - uint8_t rop = copy_ROP[gc->alu]; DBG(("%s: plane=%x x%d\n", __FUNCTION__, (unsigned)bitplane, n)); @@ -2787,6 +2787,16 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, if (closure) sna_damage_add_boxes(closure, box, n, dx, dy); + br00 = 3 << 20; + br13 = priv->gpu_bo->pitch; + if (sna->kgem.gen >= 40) { + if (priv->gpu_bo->tiling) + br00 |= BLT_DST_TILED; + br13 >>= 2; + } + br13 |= blt_depth(drawable->depth) << 24; + br13 |= copy_ROP[gc->alu] << 16; + kgem_set_mode(&sna->kgem, KGEM_BLT); do { int bx1 = (box->x1 + sx) & ~7; @@ -2815,18 +2825,9 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, } b = sna->kgem.batch + sna->kgem.nbatch; - b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride); - if (drawable->bitsPerPixel == 32) - b[0] |= 3 << 20; + b[0] = XY_MONO_SRC_COPY_IMM | (5 + src_stride) | br00; b[0] |= ((box->x1 + sx) & 7) << 17; - b[1] = priv->gpu_bo->pitch; - if (sna->kgem.gen >= 40) { - if (priv->gpu_bo->tiling) - b[0] |= BLT_DST_TILED; - b[1] >>= 2; - } - b[1] |= blt_depth(drawable->depth) << 24; - b[1] |= rop << 16; + b[1] = br13; b[2] = (box->y1 + dy) << 16 | (box->x1 + dx); b[3] = (box->y2 + dy) << 16 | (box->x2 + dx); b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, @@ -2841,18 +2842,17 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, sna->kgem.nbatch += 7 + src_stride; dst = (uint8_t *)&b[7]; - bstride -= bw; - src_stride = bitmap->devKind; - src = (uint8_t*)bitmap->devPrivate.ptr; + src = bitmap->devPrivate.ptr; src += (box->y1 + sy) * src_stride + bx1/8; - src_stride -= bw; + src_stride -= bstride; do { - int i = bw; + int i = bstride; do { *dst++ = byte_reverse(*src++); - } while (--i); - dst += bstride; + *dst++ = byte_reverse(*src++); + i -= 2; + } while (i); src += src_stride; } while (--bh); } else { @@ -2873,35 +2873,10 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, if (!upload) break; - dst = ptr; - bstride -= bw; - - src_stride = bitmap->devKind; - src = (uint8_t*)bitmap->devPrivate.ptr; - src += (box->y1 + sy) * src_stride + bx1/8; - src_stride -= bw; - do { - int i = bw; - do { - *dst++ = byte_reverse(*src++); - } while (--i); - dst += bstride; - src += src_stride; - } while (--bh); - b = sna->kgem.batch + sna->kgem.nbatch; - b[0] = XY_MONO_SRC_COPY; - if (drawable->bitsPerPixel == 32) - b[0] |= 3 << 20; + b[0] = XY_MONO_SRC_COPY | br00; b[0] |= ((box->x1 + sx) & 7) << 17; - b[1] = priv->gpu_bo->pitch; - if (sna->kgem.gen >= 40) { - if (priv->gpu_bo->tiling) - b[0] |= BLT_DST_TILED; - b[1] >>= 2; - } - b[1] |= blt_depth(drawable->depth) << 24; - b[1] |= rop << 16; + b[1] = br13; b[2] = (box->y1 + dy) << 16 | (box->x1 + dx); b[3] = (box->y2 + dy) << 16 | (box->x2 + dx); b[4] = kgem_add_reloc(&sna->kgem, sna->kgem.nbatch + 4, @@ -2919,6 +2894,22 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr drawable, GCPtr gc, b[7] = gc->fgPixel; sna->kgem.nbatch += 8; + + dst = ptr; + src_stride = bitmap->devKind; + src = bitmap->devPrivate.ptr; + src += (box->y1 + sy) * src_stride + bx1/8; + src_stride -= bstride; + do { + int i = bstride; + do { + *dst++ = byte_reverse(*src++); + *dst++ = byte_reverse(*src++); + i -= 2; + } while (i); + src += src_stride; + } while (--bh); + kgem_bo_destroy(&sna->kgem, upload); } |