Mercurial > sdl-ios-xcode
comparison src/video/SDL_blit_A.c @ 3899:081aecdb0911 SDL-1.2
From: Gabriel Gambetta
To: SDL Mailing List <sdl@libsdl.org>
Date: Fri, 17 Nov 2006 00:39:29 -0200
Subject: [SDL] Alpha blending bug - fixed?
It turns out mm5 never got the correct value. This failed :
[...]
"movd %1, %%mm5\n\t"
: : "m" (amask), "m" (sf->Ashift) );
mm5 got 0xFF000018 instead of 0x00000018. However I did this :
Uint32 ashift = sf->Ashift;
[...]
"movd %1, %%mm5\n\t"
: : "m" (amask), "m" (ashift) );
and everything worked fine.
The only thing I could find out was that ashift is 32-bit aligned but
sf->Ashift isn't:
printf("ashift %8X [%d]\n", &ashift, (int)(&ashift) % 4);
printf("sf->Ashift %8X [%d]\n", &sf->Ashift, (int)(&sf->Ashift) % 4);
ashift at BFF0E0C4 [0]
sf->Ashift at 08AFB9CD [1]
Could this be the problem? If it is, the fix is extremely trivial.
Should I submit a patch?
--Gabriel
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 21 Nov 2006 23:17:00 +0000 |
parents | 571c75f3d093 |
children | af4d584e0edb |
comparison
equal
deleted
inserted
replaced
3898:899d07087694 | 3899:081aecdb0911 |
---|---|
1564 int srcskip = info->s_skip >> 2; | 1564 int srcskip = info->s_skip >> 2; |
1565 Uint32 *dstp = (Uint32 *)info->d_pixels; | 1565 Uint32 *dstp = (Uint32 *)info->d_pixels; |
1566 int dstskip = info->d_skip >> 2; | 1566 int dstskip = info->d_skip >> 2; |
1567 SDL_PixelFormat* sf = info->src; | 1567 SDL_PixelFormat* sf = info->src; |
1568 Uint32 amask = sf->Amask; | 1568 Uint32 amask = sf->Amask; |
1569 Uint32 ashift = sf->Ashift; | |
1569 | 1570 |
1570 __asm__ ( | 1571 __asm__ ( |
1571 /* make mm6 all zeros. */ | 1572 /* make mm6 all zeros. */ |
1572 "pxor %%mm6, %%mm6\n" | 1573 "pxor %%mm6, %%mm6\n" |
1573 | 1574 |
1585 "pxor %%mm4, %%mm3\n\t" /* 0000F000 -> mm3 (~channel mask) */ | 1586 "pxor %%mm4, %%mm3\n\t" /* 0000F000 -> mm3 (~channel mask) */ |
1586 | 1587 |
1587 /* get alpha channel shift */ | 1588 /* get alpha channel shift */ |
1588 "movd %1, %%mm5\n\t" /* Ashift -> mm5 */ | 1589 "movd %1, %%mm5\n\t" /* Ashift -> mm5 */ |
1589 | 1590 |
1590 : /* nothing */ : "m" (sf->Amask), "m" (sf->Ashift) ); | 1591 : /* nothing */ : "m" (amask), "m" (ashift) ); |
1591 | 1592 |
1592 while(height--) { | 1593 while(height--) { |
1593 | 1594 |
1594 DUFFS_LOOP4({ | 1595 DUFFS_LOOP4({ |
1595 Uint32 alpha; | 1596 Uint32 alpha; |