comparison src/video/SDL_blit_N.c @ 1544:ab1e4c41ab71

Fixed bug #33 Mike Frysinger wrote: > with libsdl-1.2.9, some games (like bomberclone) started > segfaulting in Gentoo [...snip...] > the last change in the last hunk: [...snip...] > if i change the statement to read: > (table[which].blit_features & GetBlitFeatures()) == GetBlitFeatures() > bomberclone no longer segfaults on my box Alex Volkov wrote: > The test "(table[which].blit_features & GetBlitFeatures()) == > table[which].blit_features)" is correct, and the previous > "(table[which].cpu_mmx == SDL_HasMMX())" was actually broken. I think there is potentially a slightly different cause of the above problem. During the introduction of the Altivec code, the blit_table struct field 'alpha' got changed from a straightforward enum to a bitmask, which makes perfect sense by itself. However, now the table driven blitter selection code in SDL_CalculateBlitN() can choose the wrong blitters when searching for a NO_ALPHA blitter because of the following code: int a_need = 0; ... (a_need & table[which].alpha) == a_need && When searching through the normal_blit_2[] table, a SET_ALPHA blitter (like Blit_RGB565_ARGB8888) can now be selected instead of a NO_ALPHA one, causing alpha channel bits to appear in a non-alpha destination surface. I suppose this could theoretically be an indirect cause of the segfault mentioned above. I *think* this can be fixed by changing to int a_need = NO_ALPHA;
author Sam Lantinga <slouken@libsdl.org>
date Wed, 15 Mar 2006 15:47:49 +0000
parents 98f9b16f565c
children 14717b52abc0
comparison
equal deleted inserted replaced
1543:98f9b16f565c 1544:ab1e4c41ab71
2431 } else { 2431 } else {
2432 blitfun = BlitNto1; 2432 blitfun = BlitNto1;
2433 } 2433 }
2434 } else { 2434 } else {
2435 /* Now the meat, choose the blitter we want */ 2435 /* Now the meat, choose the blitter we want */
2436 int a_need = 0; 2436 int a_need = NO_ALPHA;
2437 if(dstfmt->Amask) 2437 if(dstfmt->Amask)
2438 a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA; 2438 a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA;
2439 table = normal_blit[srcfmt->BytesPerPixel-1]; 2439 table = normal_blit[srcfmt->BytesPerPixel-1];
2440 for ( which=0; table[which].dstbpp; ++which ) { 2440 for ( which=0; table[which].dstbpp; ++which ) {
2441 if ( MASKOK(srcfmt->Rmask, table[which].srcR) && 2441 if ( MASKOK(srcfmt->Rmask, table[which].srcR) &&