diff --git a/pixman/ChangeLog b/pixman/ChangeLog index 77dd50be2..4b71721f9 100644 --- a/pixman/ChangeLog +++ b/pixman/ChangeLog @@ -1,3 +1,15 @@ +2005-08-18 Billy Biggs + + * 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 * src/fbcompose.c: (fbFetchTransformed): Special case projective 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; } @@ -1338,6 +1350,56 @@ fbCompositeSrc_x888x8x8888mmx (pixman_operator_t op, _mm_empty(); } +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, 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;