summaryrefslogtreecommitdiff
path: root/fb/fbblt.c
diff options
context:
space:
mode:
authorAdam Jackson <ajax@nwnk.net>2006-01-18 19:42:56 +0000
committerAdam Jackson <ajax@nwnk.net>2006-01-18 19:42:56 +0000
commit1c3f8727b2349c9b988eaa744f11366322d42538 (patch)
tree11832cf6c4c993d2c01f63d0b75e904315690342 /fb/fbblt.c
parente70b64b93024d05519014fb1b76fe26bd9f3a496 (diff)
More kdrive merge, fast path fbBlt to use memcpy() when possible. Good for
-5% to 60% speedup on XGetImage, and 0% to 10% speedup on copies within host memory. Based on work by Jaymz Julian.
Diffstat (limited to 'fb/fbblt.c')
-rw-r--r--fb/fbblt.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/fb/fbblt.c b/fb/fbblt.c
index c2617a718..e173b447c 100644
--- a/fb/fbblt.c
+++ b/fb/fbblt.c
@@ -77,6 +77,29 @@ fbBlt (FbBits *srcLine,
return;
}
#endif
+
+ if (alu == GXcopy && pm == FB_ALLONES && !reverse &&
+ !(srcX & 7) && !(dstX & 7) && !(width & 7)) {
+ int i;
+ CARD8 *src = (CARD8 *) srcLine;
+ CARD8 *dst = (CARD8 *) dstLine;
+
+ srcStride *= sizeof(FbBits);
+ dstStride *= sizeof(FbBits);
+ width >>= 3;
+ src += (srcX >> 3);
+ dst += (dstX >> 3);
+
+ if (!upsidedown)
+ for (i = 0; i < height; i++)
+ memcpy(dst + i * dstStride, src + i * srcStride, width);
+ else
+ for (i = height - 1; i >= 0; i--)
+ memcpy(dst + i * dstStride, src + i * srcStride, width);
+
+ return;
+ }
+
FbInitializeMergeRop(alu, pm);
destInvarient = FbDestInvarientMergeRop();
if (upsidedown)