summaryrefslogtreecommitdiff
path: root/pixman
diff options
context:
space:
mode:
authorBilly Biggs <vektor@dumbterm.net>2005-08-18 19:13:06 +0000
committerBilly Biggs <vektor@dumbterm.net>2005-08-18 19:13:06 +0000
commitd809e829806c68b87939e6598986d45cbd3862b9 (patch)
tree55802b46b7c52a430ceac004b49b1fbebe2f7b3a /pixman
parentf5afeec18a95b75102087abbf7497a45ff6d80c6 (diff)
downloadcairo-d809e829806c68b87939e6598986d45cbd3862b9.tar.gz
Special case alpha values of 0 and 0xff. (fbCompositeSrc_8888x8888mmx): Add an MMX implementation for a common operation when using pixman.
Prototype for the new function. Call the new function where appropriate.
Diffstat (limited to 'pixman')
-rw-r--r--pixman/ChangeLog12
-rw-r--r--pixman/src/fbmmx.c80
-rw-r--r--pixman/src/fbmmx.h12
-rw-r--r--pixman/src/fbpict.c16
4 files changed, 108 insertions, 12 deletions
diff --git a/pixman/ChangeLog b/pixman/ChangeLog
index 77dd50be2..4b71721f9 100644
--- a/pixman/ChangeLog
+++ b/pixman/ChangeLog
@@ -1,5 +1,17 @@
2005-08-18 Billy Biggs <vektor@dumbterm.net>
+ * src/fbmmx.c: (mmxCombineMaskU), (mmxCombineOverU): Special case
+ alpha values of 0 and 0xff.
+ (fbCompositeSrc_8888x8888mmx): Add an MMX implementation for
+ a common operation when using pixman.
+
+ * src/fbmmx.h: Prototype for the new function.
+
+ * src/fbpict.c: (fbComposite): Call the new function where
+ appropriate.
+
+2005-08-18 Billy Biggs <vektor@dumbterm.net>
+
* src/fbcompose.c: (fbFetchTransformed): Special case projective
transforms so we can avoid doing the expensive 64-bit math.
Unroll the bilinear interpolation loops for an extra boost.
diff --git a/pixman/src/fbmmx.c b/pixman/src/fbmmx.c
index 288b52a0d..42ba4162b 100644
--- a/pixman/src/fbmmx.c
+++ b/pixman/src/fbmmx.c
@@ -374,11 +374,17 @@ mmxCombineMaskU (CARD32 *src, const CARD32 *mask, int width)
{
const CARD32 *end = mask + width;
while (mask < end) {
- __m64 a = load8888(*mask);
- __m64 s = load8888(*src);
- a = expand_alpha(a);
- s = pix_multiply(s, a);
- *src = store8888(s);
+ CARD32 mmask = *mask;
+ CARD32 maska = mmask >> 24;
+ if (maska == 0) {
+ *src = 0;
+ } else if (maska != 0xff) {
+ __m64 a = load8888(mmask);
+ __m64 s = load8888(*src);
+ a = expand_alpha(a);
+ s = pix_multiply(s, a);
+ *src = store8888(s);
+ }
++src;
++mask;
}
@@ -392,10 +398,16 @@ mmxCombineOverU (CARD32 *dest, const CARD32 *src, int width)
const CARD32 *end = dest + width;
while (dest < end) {
- __m64 s, sa;
- s = load8888(*src);
- sa = expand_alpha(s);
- *dest = store8888(over(s, sa, load8888(*dest)));
+ CARD32 ssrc = *src;
+ CARD32 a = ssrc >> 24;
+ if (a == 0xff) {
+ *dest = ssrc;
+ } else if (a) {
+ __m64 s, sa;
+ s = load8888(ssrc);
+ sa = expand_alpha(s);
+ *dest = store8888(over(s, sa, load8888(*dest)));
+ }
++dest;
++src;
}
@@ -1339,6 +1351,56 @@ fbCompositeSrc_x888x8x8888mmx (pixman_operator_t op,
}
void
+fbCompositeSrc_8888x8888mmx (pixman_operator_t op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ CARD32 *dstLine, *dst;
+ CARD32 *srcLine, *src, s;
+ FbStride dstStride, srcStride;
+ CARD8 a;
+ CARD16 w;
+
+ fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
+ fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
+
+ while (height--)
+ {
+ dst = dstLine;
+ dstLine += dstStride;
+ src = srcLine;
+ srcLine += srcStride;
+ w = width;
+
+ while (w--)
+ {
+ s = *src++;
+ a = s >> 24;
+ if (a == 0xff)
+ *dst = s;
+ else if (a) {
+ __m64 ms, sa;
+ ms = load8888(s);
+ sa = expand_alpha(ms);
+ *dst = store8888(over(ms, sa, load8888(*dst)));
+ }
+ dst++;
+ }
+ }
+ _mm_empty();
+}
+
+
+void
fbCompositeSolidMask_nx8x8888mmx (pixman_operator_t op,
PicturePtr pSrc,
PicturePtr pMask,
diff --git a/pixman/src/fbmmx.h b/pixman/src/fbmmx.h
index d9de56a57..5da42a066 100644
--- a/pixman/src/fbmmx.h
+++ b/pixman/src/fbmmx.h
@@ -198,6 +198,18 @@ void fbCompositeSrc_8888x8x8888mmx (pixman_operator_t op,
INT16 yDst,
CARD16 width,
CARD16 height);
+void fbCompositeSrc_8888x8888mmx (pixman_operator_t op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height);
Bool fbCopyAreammx (FbPixels *pSrc,
FbPixels *pDst,
int src_x,
diff --git a/pixman/src/fbpict.c b/pixman/src/fbpict.c
index 6238c250d..4446a01ec 100644
--- a/pixman/src/fbpict.c
+++ b/pixman/src/fbpict.c
@@ -1,5 +1,5 @@
/*
- * $Id: fbpict.c,v 1.2 2005-08-18 13:01:45 vektor Exp $
+ * $Id: fbpict.c,v 1.3 2005-08-19 02:13:07 vektor Exp $
*
* Copyright © 2000 SuSE, Inc.
*
@@ -1693,7 +1693,12 @@ pixman_composite (pixman_operator_t op,
switch (pDst->format_code) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
- func = fbCompositeSrc_8888x8888;
+#ifdef USE_MMX
+ if (fbHaveMMX())
+ func = fbCompositeSrc_8888x8888mmx;
+ else
+#endif
+ func = fbCompositeSrc_8888x8888;
break;
case PICT_r8g8b8:
func = fbCompositeSrc_8888x0888;
@@ -1707,7 +1712,12 @@ pixman_composite (pixman_operator_t op,
switch (pDst->format_code) {
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
- func = fbCompositeSrc_8888x8888;
+#ifdef USE_MMX
+ if (fbHaveMMX())
+ func = fbCompositeSrc_8888x8888mmx;
+ else
+#endif
+ func = fbCompositeSrc_8888x8888;
break;
case PICT_b8g8r8:
func = fbCompositeSrc_8888x0888;