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.
This commit is contained in:
Billy Biggs 2005-08-18 19:13:06 +00:00
parent f5afeec18a
commit d809e82980
4 changed files with 108 additions and 12 deletions

View file

@ -1,3 +1,15 @@
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

View file

@ -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,

View file

@ -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,

View file

@ -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;