From 7166e344299bea57c2c1d1fab37587e5a1591945 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 8 Jan 2006 21:18:15 +0000 Subject: [PATCH] From Bug #36: There are a couple of issues with the selection of Altivec alpha-blitting routines in CalculateAlphaBlit() in src/video/SDL_Blit_A.c. 1) There's no check for the presence of Altivec when checking if the Blit32to565PixelAlphaAltivec() routine can be selected. 2) Altivec cannot be used in video memory, and there's no check if the destination surface is a hardware surface. (Alpha-blitting to a hardware surface with GPU support is a bad idea, but somebody's bound to do it anyway.) Patch to fix these attached. --- src/video/SDL_blit_A.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/video/SDL_blit_A.c b/src/video/SDL_blit_A.c index 3bacb5d93..922fef31c 100644 --- a/src/video/SDL_blit_A.c +++ b/src/video/SDL_blit_A.c @@ -2145,7 +2145,8 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) return BlitNto1SurfaceAlphaKey; else #ifdef USE_ALTIVEC_BLITTERS - if (sf->BytesPerPixel == 4 && df->BytesPerPixel == 4 && SDL_HasAltiVec()) + if (sf->BytesPerPixel == 4 && df->BytesPerPixel == 4 && + !(surface->map->dst->flags & SDL_HWSURFACE) && SDL_HasAltiVec()) return Blit32to32SurfaceAlphaKeyAltivec; else #endif @@ -2192,7 +2193,7 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) else #endif #ifdef USE_ALTIVEC_BLITTERS - if(SDL_HasAltiVec()) + if(!(surface->map->dst->flags & SDL_HWSURFACE) && SDL_HasAltiVec()) return BlitRGBtoRGBSurfaceAlphaAltivec; else #endif @@ -2200,7 +2201,8 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) } else #ifdef USE_ALTIVEC_BLITTERS - if((sf->BytesPerPixel == 4) && SDL_HasAltiVec()) + if((sf->BytesPerPixel == 4) && + !(surface->map->dst->flags & SDL_HWSURFACE) && SDL_HasAltiVec()) return Blit32to32SurfaceAlphaAltivec; else #endif @@ -2219,9 +2221,9 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) case 2: #ifdef USE_ALTIVEC_BLITTERS - if(sf->BytesPerPixel == 4 && + if(sf->BytesPerPixel == 4 && !(surface->map->dst->flags & SDL_HWSURFACE) && df->Gmask == 0x7e0 && - df->Bmask == 0x1f) + df->Bmask == 0x1f && SDL_HasAltiVec()) return Blit32to565PixelAlphaAltivec; else #endif @@ -2252,14 +2254,15 @@ SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface *surface, int blit_index) else #endif #ifdef USE_ALTIVEC_BLITTERS - if(SDL_HasAltiVec()) + if(!(surface->map->dst->flags & SDL_HWSURFACE) && SDL_HasAltiVec()) return BlitRGBtoRGBPixelAlphaAltivec; else #endif return BlitRGBtoRGBPixelAlpha; } #ifdef USE_ALTIVEC_BLITTERS - if (sf->Amask && sf->BytesPerPixel == 4 && SDL_HasAltiVec()) + if (sf->Amask && sf->BytesPerPixel == 4 && + !(surface->map->dst->flags & SDL_HWSURFACE) && SDL_HasAltiVec()) return Blit32to32PixelAlphaAltivec; else #endif