📄 fbmmx.c
字号:
*dest = store8888(s); ++src; ++mask; ++dest; } _mm_empty();}static FASTCALL voidmmxCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); *dest = store8888(in_over (s, sa, a, d)); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); *dest = store8888(over (d, da, in (s, a))); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); da = negate(da); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); a = negate(a); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}static FASTCALL voidmmxCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width){ const CARD32 *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); s = pix_multiply(s, a); d = pix_add(s, d); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty();}extern FbComposeFunctions composeFunctions;void fbComposeSetupMMX(void){ /* check if we have MMX support and initialize accordingly */ if (fbHaveMMX()) { composeFunctions.combineU[PIXMAN_OPERATOR_OVER] = mmxCombineOverU; composeFunctions.combineU[PIXMAN_OPERATOR_OVER_REVERSE] = mmxCombineOverReverseU; composeFunctions.combineU[PIXMAN_OPERATOR_IN] = mmxCombineInU; composeFunctions.combineU[PIXMAN_OPERATOR_IN_REVERSE] = mmxCombineInReverseU; composeFunctions.combineU[PIXMAN_OPERATOR_OUT] = mmxCombineOutU; composeFunctions.combineU[PIXMAN_OPERATOR_OUT_REVERSE] = mmxCombineOutReverseU; composeFunctions.combineU[PIXMAN_OPERATOR_ATOP] = mmxCombineAtopU; composeFunctions.combineU[PIXMAN_OPERATOR_ATOP_REVERSE] = mmxCombineAtopReverseU; composeFunctions.combineU[PIXMAN_OPERATOR_XOR] = mmxCombineXorU; composeFunctions.combineU[PIXMAN_OPERATOR_ADD] = mmxCombineAddU; composeFunctions.combineU[PIXMAN_OPERATOR_SATURATE] = mmxCombineSaturateU; composeFunctions.combineC[PIXMAN_OPERATOR_SRC] = mmxCombineSrcC; composeFunctions.combineC[PIXMAN_OPERATOR_OVER] = mmxCombineOverC; composeFunctions.combineC[PIXMAN_OPERATOR_OVER_REVERSE] = mmxCombineOverReverseC; composeFunctions.combineC[PIXMAN_OPERATOR_IN] = mmxCombineInC; composeFunctions.combineC[PIXMAN_OPERATOR_IN_REVERSE] = mmxCombineInReverseC; composeFunctions.combineC[PIXMAN_OPERATOR_OUT] = mmxCombineOutC; composeFunctions.combineC[PIXMAN_OPERATOR_OUT_REVERSE] = mmxCombineOutReverseC; composeFunctions.combineC[PIXMAN_OPERATOR_ATOP] = mmxCombineAtopC; composeFunctions.combineC[PIXMAN_OPERATOR_ATOP_REVERSE] = mmxCombineAtopReverseC; composeFunctions.combineC[PIXMAN_OPERATOR_XOR] = mmxCombineXorC; composeFunctions.combineC[PIXMAN_OPERATOR_ADD] = mmxCombineAddC; composeFunctions.combineMaskU = mmxCombineMaskU; }}/* ------------------ MMX code paths called from fbpict.c ----------------------- */voidfbCompositeSolid_nx8888mmx (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 src; CARD32 *dstLine, *dst; CARD16 w; FbStride dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, pDst, src); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } while (w >= 2) { __m64 vdest; __m64 dest0, dest1; vdest = *(__m64 *)dst; dest0 = over(vsrc, vsrca, expand8888(vdest, 0)); dest1 = over(vsrc, vsrca, expand8888(vdest, 1)); *(__m64 *)dst = pack8888(dest0, dest1); dst += 2; w -= 2; } CHECKPOINT(); while (w) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } } _mm_empty();}voidfbCompositeSolid_nx0565mmx (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 src; CARD16 *dstLine, *dst; CARD16 w; FbStride dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, pDst, src); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong d = *dst; __m64 vdest = expand565 ((__m64)d, 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = (ullong)vdest; w--; dst++; } while (w >= 4) { __m64 vdest; vdest = *(__m64 *)dst; vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 0)), vdest, 0); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 1)), vdest, 1); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 2)), vdest, 2); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; dst += 4; w -= 4; } CHECKPOINT(); while (w) { ullong d = *dst; __m64 vdest = expand565 ((__m64)d, 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = (ullong)vdest; w--; dst++; } } _mm_empty();}voidfbCompositeSolidMask_nx8888x8888Cmmx (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 src, srca; CARD32 *dstLine; CARD32 *maskLine; FbStride dstStride, maskStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, pDst, src); srca = src >> 24; if (srca == 0) return; fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, CARD32, maskStride, maskLine, 1); vsrc = load8888(src); vsrca = expand_alpha(vsrc); while (height--) { int twidth = width; CARD32 *p = (CARD32 *)maskLine; CARD32 *q = (CARD32 *)dstLine; while (twidth && (unsigned long)q & 7) { CARD32 m = *(CARD32 *)p; if (m) { __m64 vdest = load8888(*q); vdest = in_over(vsrc, vsrca, load8888(m), vdest); *q = store8888(vdest); } twidth--; p++; q++; } while (twidth >= 2) { CARD32 m0, m1; m0 = *p; m1 = *(p + 1); if (m0 | m1) { __m64 dest0, dest1; __m64 vdest = *(__m64 *)q; dest0 = in_over(vsrc, vsrca, load8888(m0), expand8888 (vdest, 0)); dest1 = in_over(vsrc, vsrca, load8888(m1), expand8888 (vdest, 1)); *(__m64 *)q = pack8888(dest0, dest1); } p += 2; q += 2; twidth -= 2; } while (twidth) { CARD32 m = *(CARD32 *)p; if (m) { __m64 vdest = load8888(*q); vdest = in_over(vsrc, vsrca, load8888(m), vdest); *q = store8888(vdest); } twidth--; p++; q++; } dstLine += dstStride; maskLine += maskStride; } _mm_empty();}voidfbCompositeSrc_8888x8x8888mmx (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; CARD8 *maskLine; CARD32 mask; __m64 vmask; FbStride dstStride, srcStride, maskStride; CARD16 w; __m64 srca; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1); fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1); mask = *maskLine << 24 | *maskLine << 16 | *maskLine << 8 | *maskLine; vmask = load8888 (mask); srca = MC(4x00ff); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (over (s, expand_alpha (s), d)); w--; dst++; src++; } while (w >= 2) { __m64 vs = *(__m64 *)dst; __m64 vd = *(__m64 *)src; __m64 vsrc0 = expand8888 (vs, 0); __m64 vsrc1 = expand8888 (vs, 1); *(__m64 *)dst = (__m64)pack8888 ( in_over (vsrc0, expand_alpha (vsrc0), vmask, expand8888 (vd, 0)), in_over (vsrc1, expand_alpha (vsrc1), vmask, expand8888 (vd, 1))); w -= 2; dst += 2; src += 2; } while (w) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (in_over (s, expand_alpha (s), vmask, d)); w--; dst++; src++; } } _mm_empty();}voidfbCompositeSrc_x888x8x8888mmx (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; CARD8 *maskLine; CARD32 mask; __m64 vmask; FbStride dstStride, srcStride, maskStride; CARD16 w; __m64 srca;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -