标题:问一个AlphaBlend的问题
只看楼主
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
得分:0 
不好意思MMX我也没用过
等下周有时间时我把Intel的手册翻一下可能就知道原因了

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2010-10-24 17:48
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:12 
unsigned char sHigh, sMid, sLow, dHigh, dMid, dLow;

sHigh = (src>> 16) & 0xFF;
sMid = (src>> 8) & 0xFF;
sLow = src & 0xFF;

dHigh = (dest>> 16) & 0xFF;
dMid = (dest>> 8) & 0xFF;
dLow = dest & 0xFF;

return (((dHigh* (0xFF - alpha) + sHigh * alpha) / 0x100) << 16) |
     (((dMid* (0xFF - alpha) + sMid* alpha) / 0x100) << 8) |
     ((dLow* (0xFF - alpha) + sLow * alpha) / 0x100);



[ 本帖最后由 BlueGuy 于 2010-10-24 19:04 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-10-24 18:20
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
内联汇编啥的一点不懂, 已经达到我水平的阈值了,

我就是真命天子,顺我者生,逆我者死!
2010-10-24 18:22
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:12 
//FOR MMX
程序代码:
_asm {
        mov            edi,dst
        mov            esi,src
        mov            edx,h                 //Height of image.
        pxor        mm6,mm6
        pxor        mm7,mm7
        xor            eax,eax
scan_loop:
        mov            ecx,w                //Width of image.
        xor            ebx,ebx
pix_loop:
        movq        mm4,[esi+ebx*8]        // mm4 = src (RG BA RG BA)
        movq        mm5,[edi+ebx*8]        // mm5 = dst (RG BA RG BA)
// FIRST PIXEL
        movq        mm0,mm4                // mm0 = src (-- -- RG BA)
        movq        mm1,mm5                // mm1 = dst (-- -- RG BA)
        punpcklbw    mm0,mm6                // mm0 = (0R 0G 0B 0A)
        mov            al,[esi+ebx*8+3]    // eax = pixel alpha (0 - 255)
        punpcklbw    mm1,mm7                // mm1 = (0R 0G 0B 0A)
        movd        mm2,eax                // 00 00 00 0A
        movq        mm3,mm1                // mm3 = mm1: dst (0R 0G 0B 0A)
        punpcklwd    mm2,mm2                // 00 00 0A 0A
        psubw        mm0,mm1                // mm0 = mm0 - mm1
        punpckldq    mm2,mm2                // 0A 0A 0A 0A
        psllw        mm3,8                // mm3 = mm1 * 256
        pmullw        mm0,mm2                // mm0 = (src - dst) * alpha
        paddw        mm0,mm3                // mm0 = (src - dst) * alpha + dst * 256
        psrlw        mm0,8                // mm0 = ((src - dst) * alpha + dst * 256) / 256
        packuswb    mm0,mm6                // mm0 = RGBA
// SECOND PIXEL
        punpckhbw    mm4,mm6                // mm4 = (0R 0G 0B 0A)
        mov            al,[esi+ebx*8+7]    // eax = pixel alpha (0 - 255)
        punpckhbw    mm5,mm7                // mm5 = (0R 0G 0B 0A)
        movd        mm2,eax                // 00 00 00 0A
        movq        mm3,mm5                // mm3 = mm5: dst (0R 0G 0B 0A)
        punpcklwd    mm2,mm2                // 00 00 0A 0A
        psubw        mm4,mm5                // mm4 = mm4 - mm5
        punpckldq    mm2,mm2                // 0A 0A 0A 0A
        psllw        mm3,8                // mm3 = mm5 * 256
        pmullw        mm4,mm2                // mm4 = (src - dst) * alpha
        paddw        mm4,mm3                // mm4 = (src - dst) * alpha + dst * 256
        psrlw        mm4,8                // mm4 = ((src - dst) * alpha + dst * 256) / 256
        packuswb    mm4,mm6                // mm4 = RGBA
        punpckldq    mm0,mm4                // mm0 = RG BA RG BA
        movq        [edi+ebx*8],mm0        // dst = mm0
        inc            ebx
// REPEAT
        loop        pix_loop
        mov            ebx, wmul4
        add            esi, ebx
        add            edi, ebx
        dec            edx
        jnz            scan_loop
    }
//FOR SSE
程序代码:
_asm {
        mov            edi,dst
        mov            esi,src
        mov            edx,h
        pxor        mm6,mm6
        pxor        mm7,mm7
        xor            eax,eax
scan_loop:
        mov            ecx,w
        xor            ebx,ebx
pix_loop:
        movq        mm4,[esi+ebx*8]        // mm0 = src (RG BA RG BA)
        movq        mm5,[edi+ebx*8]        // mm1 = dst (RG BA RG BA)
// FIRST PIXEL
        movq        mm0,mm4                // mm0 = 00 00 RG BA
        movq        mm1,mm5                // mm1 = 00 00 RG BA
        punpcklbw    mm0,mm6                // mm0 = (0R 0G 0B 0A)
        punpcklbw    mm1,mm7                // mm0 = (0R 0G 0B 0A)
        pshufw        mm2,mm0,0ffh        // mm2 = 0A 0A 0A 0A
        movq        mm3,mm1                // mm3 = mm1
        psubw        mm0,mm1                // mm0 = mm0 - mm1
        psllw        mm3,8                // mm3 = mm1 * 256
        pmullw        mm0,mm2                // mm0 = (src-dst)*alpha
        paddw        mm0,mm3                // mm0 = (src-dst)*alpha+dst*256
        psrlw        mm0,8                // mm0 = ((src - dst) * alpha + dst * 256) / 256
// SECOND PIXEL
        punpckhbw    mm5,mm7                // mm5 = (0R 0G 0B 0A)
        punpckhbw    mm4,mm6                // mm4 = (0R 0G 0B 0A)
        movq        mm3,mm5                // mm3 = mm5
        pshufw        mm2,mm4,0ffh        // mm2 = 0A 0A 0A 0A
        psllw        mm3,8                // mm3 = mm5 * 256
        psubw        mm4,mm5                // mm4 = mm4 - mm5
        pmullw        mm4,mm2                // mm4 = (src-dst)*alpha
        paddw        mm4,mm3                // mm4 = (src-dst)*alpha+dst*256
        psrlw        mm4,8                // mm4 = ((src - dst) * alpha + dst * 256) / 256
        packuswb    mm0,mm4                // mm0 = RG BA RG BA
        movq        [edi+ebx*8],mm0        // dst = mm0
        inc            ebx
        loop        pix_loop
//
        mov            ebx, wmul4
        add            esi, ebx
        add            edi, ebx
        dec            edx
        jnz            scan_loop
    }
N久前收集的东东。


[ 本帖最后由 东海一鱼 于 2010-10-25 00:02 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-10-24 23:59
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
嘛。。。整块计算的MMX很容易搜索到,但单个像素的,要比C版本快的MMX似乎找不着。。。。

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-27 23:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-323742-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.142730 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved