xf86-video-intel: 2 commits - src/sna/blt.c src/sna/sna_accel.c src/sna/sna.h src/sna/sna_io.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Jun 14 15:33:17 PDT 2012
src/sna/blt.c | 239 +++++++++++++++++++++++-----------------------------
src/sna/sna.h | 13 --
src/sna/sna_accel.c | 7 -
src/sna/sna_io.c | 9 +
4 files changed, 125 insertions(+), 143 deletions(-)
New commits:
commit 293a867ea55d3004f5be21b1d0ad765a89c28a5a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jun 14 23:02:10 2012 +0100
sna: Specialise the self-copy blitter to handle vertically overlapping copies
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/blt.c b/src/sna/blt.c
index 99bdece..c0922b5 100644
--- a/src/sna/blt.c
+++ b/src/sna/blt.c
@@ -217,98 +217,17 @@ memcpy_blt(const void *src, void *dst, int bpp,
}
void
-memmove_blt(const void *src, void *dst, int bpp,
- int32_t src_stride, int32_t dst_stride,
- int16_t src_x, int16_t src_y,
- int16_t dst_x, int16_t dst_y,
- uint16_t width, uint16_t height)
-{
- const uint8_t *src_bytes;
- uint8_t *dst_bytes;
- int byte_width;
-
- assert(src);
- assert(dst);
- assert(width && height);
- assert(bpp >= 8);
-
- DBG(("%s: src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d\n",
- __FUNCTION__, src_x, src_y, dst_x, dst_y, width, height, src_stride, dst_stride));
-
- bpp /= 8;
-
- src_bytes = (const uint8_t *)src + src_stride * src_y + src_x * bpp;
- dst_bytes = (uint8_t *)dst + dst_stride * dst_y + dst_x * bpp;
-
- byte_width = width * bpp;
- if (byte_width == src_stride && byte_width == dst_stride) {
- byte_width *= height;
- height = 1;
- }
-
- switch (byte_width) {
- case 1:
- do {
- *dst_bytes = *src_bytes;
- src_bytes += src_stride;
- dst_bytes += dst_stride;
- } while (--height);
- break;
-
- case 2:
- do {
- *(uint16_t *)dst_bytes = *(const uint16_t *)src_bytes;
- src_bytes += src_stride;
- dst_bytes += dst_stride;
- } while (--height);
- break;
-
- case 4:
- do {
- *(uint32_t *)dst_bytes = *(const uint32_t *)src_bytes;
- src_bytes += src_stride;
- dst_bytes += dst_stride;
- } while (--height);
- break;
-
- case 8:
- do {
- *(uint64_t *)dst_bytes = *(const uint64_t *)src_bytes;
- src_bytes += src_stride;
- dst_bytes += dst_stride;
- } while (--height);
- break;
-
- default:
- if (src_stride == dst_stride) {
- if (dst_bytes < src_bytes + byte_width &&
- src_bytes < dst_bytes + byte_width) {
- do {
- memmove(dst_bytes, src_bytes, byte_width);
- src_bytes += src_stride;
- dst_bytes += src_stride;
- } while (--height);
- } else {
- do {
- memcpy(dst_bytes, src_bytes, byte_width);
- src_bytes += src_stride;
- dst_bytes += src_stride;
- } while (--height);
- }
- } else do {
- memmove(dst_bytes, src_bytes, byte_width);
- src_bytes += src_stride;
- dst_bytes += dst_stride;
- } while (--height);
- break;
- }
-}
-
-void
-memmove_blt__box(const void *src, void *dst,
- int bpp, int32_t stride,
- const BoxRec *box)
+memmove_box(const void *src, void *dst,
+ int bpp, int32_t stride,
+ const BoxRec *box,
+ int dx, int dy)
{
+ union {
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ } tmp;
const uint8_t *src_bytes;
uint8_t *dst_bytes;
int width, height;
@@ -319,8 +238,10 @@ memmove_blt__box(const void *src, void *dst,
assert(box->x2 > box->x1);
assert(box->y2 > box->y1);
- DBG(("%s: box=(%d, %d), (%d, %d), pitch=%d, bpp=%d\n",
- __FUNCTION__, box->x1, box->y1, box->x2, box->y2, stride, bpp));
+ DBG(("%s: box=(%d, %d), (%d, %d), pitch=%d, bpp=%d, dx=%d, dy=%d\n",
+ __FUNCTION__,
+ box->x1, box->y1, box->x2, box->y2,
+ stride, bpp, dx, dy));
bpp /= 8;
width = box->y1 * stride + box->x1 * bpp;
@@ -334,55 +255,111 @@ memmove_blt__box(const void *src, void *dst,
height = 1;
}
- switch (width) {
- case 1:
- do {
- *dst_bytes = *src_bytes;
- src_bytes += stride;
- dst_bytes += stride;
- } while (--height);
- break;
-
- case 2:
- do {
- *(uint16_t *)dst_bytes = *(const uint16_t *)src_bytes;
- src_bytes += stride;
- dst_bytes += stride;
- } while (--height);
- break;
-
- case 4:
- do {
- *(uint32_t *)dst_bytes = *(const uint32_t *)src_bytes;
- src_bytes += stride;
- dst_bytes += stride;
- } while (--height);
- break;
+ if (dy >= 0) {
+ switch (width) {
+ case 1:
+ do {
+ *dst_bytes = tmp.u8 = *src_bytes;
+ src_bytes += stride;
+ dst_bytes += stride;
+ } while (--height);
+ break;
- case 8:
- do {
- *(uint64_t *)dst_bytes = *(const uint64_t *)src_bytes;
- src_bytes += stride;
- dst_bytes += stride;
- } while (--height);
- break;
+ case 2:
+ do {
+ *(uint16_t *)dst_bytes = tmp.u16 = *(const uint16_t *)src_bytes;
+ src_bytes += stride;
+ dst_bytes += stride;
+ } while (--height);
+ break;
- default:
- if (dst_bytes < src_bytes + width &&
- src_bytes < dst_bytes + width) {
+ case 4:
do {
- memmove(dst_bytes, src_bytes, width);
+ *(uint32_t *)dst_bytes = tmp.u32 = *(const uint32_t *)src_bytes;
src_bytes += stride;
dst_bytes += stride;
} while (--height);
- } else {
+ break;
+
+ case 8:
do {
- memcpy(dst_bytes, src_bytes, width);
+ *(uint64_t *)dst_bytes = tmp.u64 = *(const uint64_t *)src_bytes;
src_bytes += stride;
dst_bytes += stride;
} while (--height);
+ break;
+
+ default:
+ if (dst_bytes < src_bytes + width &&
+ src_bytes < dst_bytes + width) {
+ do {
+ memmove(dst_bytes, src_bytes, width);
+ src_bytes += stride;
+ dst_bytes += stride;
+ } while (--height);
+ } else {
+ do {
+ memcpy(dst_bytes, src_bytes, width);
+ src_bytes += stride;
+ dst_bytes += stride;
+ } while (--height);
+ }
+ break;
+ }
+ } else {
+ src_bytes += (height-1) * stride;
+ dst_bytes += (height-1) * stride;
+
+ switch (width) {
+ case 1:
+ do {
+ *dst_bytes = tmp.u8 = *src_bytes;
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ break;
+
+ case 2:
+ do {
+ *(uint16_t *)dst_bytes = tmp.u16 = *(const uint16_t *)src_bytes;
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ break;
+
+ case 4:
+ do {
+ *(uint32_t *)dst_bytes = tmp.u32 = *(const uint32_t *)src_bytes;
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ break;
+
+ case 8:
+ do {
+ *(uint64_t *)dst_bytes = tmp.u64 = *(const uint64_t *)src_bytes;
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ break;
+
+ default:
+ if (dst_bytes < src_bytes + width &&
+ src_bytes < dst_bytes + width) {
+ do {
+ memmove(dst_bytes, src_bytes, width);
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ } else {
+ do {
+ memcpy(dst_bytes, src_bytes, width);
+ src_bytes -= stride;
+ dst_bytes -= stride;
+ } while (--height);
+ }
+ break;
}
- break;
}
}
diff --git a/src/sna/sna.h b/src/sna/sna.h
index a426e69..ee8273c 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -673,15 +673,10 @@ memcpy_blt(const void *src, void *dst, int bpp,
int16_t dst_x, int16_t dst_y,
uint16_t width, uint16_t height);
void
-memmove_blt(const void *src, void *dst, int bpp,
- int32_t src_stride, int32_t dst_stride,
- int16_t src_x, int16_t src_y,
- int16_t dst_x, int16_t dst_y,
- uint16_t width, uint16_t height);
-void
-memmove_blt__box(const void *src, void *dst,
- int bpp, int32_t stride,
- const BoxRec *box);
+memmove_box(const void *src, void *dst,
+ int bpp, int32_t stride,
+ const BoxRec *box,
+ int dx, int dy);
void
memcpy_xor(const void *src, void *dst, int bpp,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index a44cdb1..982f562 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3489,7 +3489,7 @@ fallback:
stride = pixmap->devKind;
bpp = pixmap->drawable.bitsPerPixel;
- if (alu == GXcopy && !reverse && !upsidedown && bpp >= 8) {
+ if (alu == GXcopy && bpp >= 8) {
dst_bits = (FbBits *)
((char *)pixmap->devPrivate.ptr +
ty * stride + tx * bpp / 8);
@@ -3498,8 +3498,9 @@ fallback:
dy * stride + dx * bpp / 8);
do {
- memmove_blt__box(src_bits, dst_bits,
- bpp, stride, box);
+ memmove_box(src_bits, dst_bits,
+ bpp, stride, box,
+ dx, dy);
box++;
} while (--n);
} else {
commit 3b76ab995bb70da5f76afead7c696cb7fd72b158
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jun 14 22:33:11 2012 +0100
sna: Add a little bit more DBG to migration IO paths
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 3c6044c..dfa0623 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -92,6 +92,12 @@ static void read_boxes_inplace(struct kgem *kgem,
return;
do {
+ DBG(("%s: copying box (%d, %d), (%d, %d)\n",
+ __FUNCTION__, box->x1, box->y1, box->x2, box->y2));
+
+ assert(box->x2 > box->x1);
+ assert(box->y2 > box->y1);
+
assert(box->x1 + src_dx >= 0);
assert(box->y1 + src_dy >= 0);
assert(box->x2 + src_dx <= pixmap->drawable.width);
@@ -502,6 +508,9 @@ static bool write_boxes_inplace(struct kgem *kgem,
box->x2 - box->x1, box->y2 - box->y1,
bpp, stride, bo->pitch));
+ assert(box->x2 > box->x1);
+ assert(box->y2 > box->y1);
+
assert(box->x1 + dst_dx >= 0);
assert((box->x2 + dst_dx)*bpp <= 8*bo->pitch);
assert(box->y1 + dst_dy >= 0);
More information about the xorg-commit
mailing list