Add new fbCompositeSrc_8888x0565mmx() function, based on patch by Dan
Williams. Bug 9682.
This commit is contained in:
parent
b2cd3b1337
commit
5a33344103
98
fb/fbmmx.c
98
fb/fbmmx.c
|
@ -1338,6 +1338,104 @@ fbCompositeSrc_8888x8888mmx (CARD8 op,
|
||||||
_mm_empty();
|
_mm_empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fbCompositeSrc_8888x0565mmx (CARD8 op,
|
||||||
|
PicturePtr pSrc,
|
||||||
|
PicturePtr pMask,
|
||||||
|
PicturePtr pDst,
|
||||||
|
INT16 xSrc,
|
||||||
|
INT16 ySrc,
|
||||||
|
INT16 xMask,
|
||||||
|
INT16 yMask,
|
||||||
|
INT16 xDst,
|
||||||
|
INT16 yDst,
|
||||||
|
CARD16 width,
|
||||||
|
CARD16 height)
|
||||||
|
{
|
||||||
|
CARD16 *dstLine, *dst;
|
||||||
|
CARD32 *srcLine, *src;
|
||||||
|
FbStride dstStride, srcStride;
|
||||||
|
CARD16 w;
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
|
||||||
|
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
||||||
|
fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
|
||||||
|
|
||||||
|
assert (pSrc->pDrawable == pMask->pDrawable);
|
||||||
|
|
||||||
|
while (height--)
|
||||||
|
{
|
||||||
|
dst = dstLine;
|
||||||
|
dstLine += dstStride;
|
||||||
|
src = srcLine;
|
||||||
|
srcLine += srcStride;
|
||||||
|
w = width;
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
|
||||||
|
while (w && (unsigned long)dst & 7)
|
||||||
|
{
|
||||||
|
__m64 vsrc = load8888 (*src);
|
||||||
|
ullong d = *dst;
|
||||||
|
__m64 vdest = expand565 ((__m64)d, 0);
|
||||||
|
|
||||||
|
vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0);
|
||||||
|
|
||||||
|
*dst = (ullong)vdest;
|
||||||
|
|
||||||
|
w--;
|
||||||
|
dst++;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
|
||||||
|
while (w >= 4)
|
||||||
|
{
|
||||||
|
__m64 vsrc0, vsrc1, vsrc2, vsrc3;
|
||||||
|
__m64 vdest;
|
||||||
|
|
||||||
|
vsrc0 = load8888(*(src + 0));
|
||||||
|
vsrc1 = load8888(*(src + 1));
|
||||||
|
vsrc2 = load8888(*(src + 2));
|
||||||
|
vsrc3 = load8888(*(src + 3));
|
||||||
|
|
||||||
|
vdest = *(__m64 *)dst;
|
||||||
|
|
||||||
|
vdest = pack565(over(vsrc0, expand_alpha(vsrc0), expand565(vdest, 0)), vdest, 0);
|
||||||
|
vdest = pack565(over(vsrc1, expand_alpha(vsrc1), expand565(vdest, 1)), vdest, 1);
|
||||||
|
vdest = pack565(over(vsrc2, expand_alpha(vsrc2), expand565(vdest, 2)), vdest, 2);
|
||||||
|
vdest = pack565(over(vsrc3, expand_alpha(vsrc3), expand565(vdest, 3)), vdest, 3);
|
||||||
|
|
||||||
|
*(__m64 *)dst = vdest;
|
||||||
|
|
||||||
|
w -= 4;
|
||||||
|
dst += 4;
|
||||||
|
src += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECKPOINT();
|
||||||
|
|
||||||
|
while (w)
|
||||||
|
{
|
||||||
|
__m64 vsrc = load8888 (*src);
|
||||||
|
ullong d = *dst;
|
||||||
|
__m64 vdest = expand565 ((__m64)d, 0);
|
||||||
|
|
||||||
|
vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0);
|
||||||
|
|
||||||
|
*dst = (ullong)vdest;
|
||||||
|
|
||||||
|
w--;
|
||||||
|
dst++;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_empty();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fbCompositeSolidMask_nx8x8888mmx (CARD8 op,
|
fbCompositeSolidMask_nx8x8888mmx (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
|
|
12
fb/fbmmx.h
12
fb/fbmmx.h
|
@ -130,6 +130,18 @@ void fbCompositeSrc_8888RevNPx8888mmx (CARD8 op,
|
||||||
INT16 yDst,
|
INT16 yDst,
|
||||||
CARD16 width,
|
CARD16 width,
|
||||||
CARD16 height);
|
CARD16 height);
|
||||||
|
void fbCompositeSrc_8888x0565mmx (CARD8 op,
|
||||||
|
PicturePtr pSrc,
|
||||||
|
PicturePtr pMask,
|
||||||
|
PicturePtr pDst,
|
||||||
|
INT16 xSrc,
|
||||||
|
INT16 ySrc,
|
||||||
|
INT16 xMask,
|
||||||
|
INT16 yMask,
|
||||||
|
INT16 xDst,
|
||||||
|
INT16 yDst,
|
||||||
|
CARD16 width,
|
||||||
|
CARD16 height);
|
||||||
void fbCompositeSrc_8888RevNPx0565mmx (CARD8 op,
|
void fbCompositeSrc_8888RevNPx0565mmx (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
PicturePtr pMask,
|
PicturePtr pMask,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user