[SDL] Alpha blending bug - found, how to fix?

Gabriel Gambetta mystml at adinet.com.uy
Thu Nov 16 17:54:44 PST 2006


I tracked down the alpha blending bug I referred to in my previous email
to BlitRGBtoRGBPixelAlphaMMX3DNOW(), GCC_ASMBLIT version. The bug is in
the branch that actually blends two pixels :


    __asm__ (
/* load in the source, and dst. */
"movd      (%0), %%mm0\n"	/* mm0(s) = 0 0 0 0 | As Rs Gs Bs */
"movd      (%1), %%mm1\n"	/* mm1(d) = 0 0 0 0 | Ad Rd Gd Bd */

/* Move the src alpha into mm2 */

/* if supporting pshufw */
/*"pshufw     $0x55, %%mm0, %%mm2\n" */ /* mm2 = 0 As 0 As |  0 As  0
As */
/*"psrlw     $8, %%mm2\n" */

/* else: */
"movd       %2,    %%mm2\n"

********** HERE IS THE BUG **********
//"psrld      %%mm5, %%mm2\n"      /* mm2 = 0 0 0 0 | 0  0  0  As */
"psrld      $24, %%mm2\n"          /* mm2 = 0 0 0 0 | 0  0  0  As */
*************************************

"punpcklwd	%%mm2, %%mm2\n"	   /* mm2 = 0 0 0 0 |  0 As  0  As */
"punpckldq	%%mm2, %%mm2\n"    /* mm2 = 0 As 0 As |  0 As  0  As */

"pand       %%mm7, %%mm2\n"        /* to preserve dest alpha */
		    

/* move the colors into words. */
"punpcklbw %%mm6, %%mm0\n"	  /* mm0 = 0 As 0 Rs | 0 Gs 0 Bs */
"punpcklbw %%mm6, %%mm1\n"        /* mm0 = 0 Ad 0 Rd | 0 Gd 0 Bd */

/* src - dst */
"psubw    %%mm1, %%mm0\n"	/* mm0 = As-Ad Rs-Rd | Gs-Gd  Bs-Bd */

/* A * (src-dst) */
"pmullw    %%mm2, %%mm0\n" /* mm0 = 0*As-d As*Rs-d | As*Gs-d  As*Bs-d */
"psrlw     $8,    %%mm0\n"  /* mm0 = 0>>8 Rc>>8 | Gc>>8  Bc>>8 */
"paddb     %%mm1, %%mm0\n"  /* mm0 = 0+Ad Rc+Rd | Gc+Gd  Bc+Bd */

"packuswb  %%mm0, %%mm0\n" /* mm0 =             | Ac Rc Gc Bc */

"movd      %%mm0, (%1)\n" /* result in mm0 */

    : : "r" (srcp), "r" (dstp), "r" (alpha) );



***** Right-shifting 24 bits there produces correct results for this
case where the alpha mask is indeed 0xFF000000. 24 is the value of
sf->Ashift which is loaded in mm5, however shifting by mm5 there
produces the bug - is it possible that mm5 is getting clobbered
somewhere?

This is my first approach to MMX so I really don't know how to continue
with this. Can anyone (preferably the original author of this function
or a MMX guru) suggest anything?

Thanks,
	--Gabriel



________________________________________________________________________
Gabriel Gambetta
Mystery Studio - http://www.mysterystudio.com
Gabriel on Graphics - http://gabrielongraphics.blogspot.com





More information about the SDL mailing list