diff options
author | Billy Biggs <vektor@dumbterm.net> | 2005-08-18 19:13:06 +0000 |
---|---|---|
committer | Billy Biggs <vektor@dumbterm.net> | 2005-08-18 19:13:06 +0000 |
commit | d809e829806c68b87939e6598986d45cbd3862b9 (patch) | |
tree | 55802b46b7c52a430ceac004b49b1fbebe2f7b3a /pixman | |
parent | f5afeec18a95b75102087abbf7497a45ff6d80c6 (diff) | |
download | cairo-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/ChangeLog | 12 | ||||
-rw-r--r-- | pixman/src/fbmmx.c | 80 | ||||
-rw-r--r-- | pixman/src/fbmmx.h | 12 | ||||
-rw-r--r-- | pixman/src/fbpict.c | 16 |
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; |