From f49163b62f3d8681080358f94c76a333b64d7247 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 17 Aug 2007 03:22:03 +0000 Subject: [PATCH] Enabled 3DNow! intrinsic support --- VisualC/SDL/SDL.vcproj | 4 ++-- configure.in | 32 ++++++++++++++++++++++++++++++++ src/video/SDL_blit.h | 3 +++ src/video/SDL_blit_A.c | 10 +++++++--- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/VisualC/SDL/SDL.vcproj b/VisualC/SDL/SDL.vcproj index a6eabda7a..1b0e9d1c6 100644 --- a/VisualC/SDL/SDL.vcproj +++ b/VisualC/SDL/SDL.vcproj @@ -47,7 +47,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\include" - PreprocessorDefinitions="_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__SSE__;__MMX__" + PreprocessorDefinitions="_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__MMX__;__3dNOW__;__SSE__" RuntimeLibrary="2" BufferSecurityCheck="false" UsePrecompiledHeader="0" @@ -145,7 +145,7 @@ InlineFunctionExpansion="1" EnableIntrinsicFunctions="false" AdditionalIncludeDirectories="..\..\include" - PreprocessorDefinitions="NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__SSE__;__MMX__" + PreprocessorDefinitions="NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;__MMX__;__3dNOW__;__SSE__" StringPooling="true" RuntimeLibrary="2" BufferSecurityCheck="false" diff --git a/configure.in b/configure.in index b7e102251..262beee9c 100644 --- a/configure.in +++ b/configure.in @@ -290,6 +290,9 @@ AC_HELP_STRING([--enable-mmx], [use MMX assembly routines [[default=yes]]]), AC_TRY_COMPILE([ #include + #ifndef __MMX__ + #error Assembler CPP flag not enabled + #endif ],[ ],[ have_gcc_mmx=yes @@ -301,6 +304,32 @@ AC_HELP_STRING([--enable-mmx], [use MMX assembly routines [[default=yes]]]), fi fi + AC_ARG_ENABLE(3dnow, +AC_HELP_STRING([--enable-3dnow], [use MMX assembly routines [[default=yes]]]), + , enable_3dnow=yes) + if test x$enable_3dnow = xyes; then + save_CFLAGS="$CFLAGS" + have_gcc_3dnow=no + AC_MSG_CHECKING(for GCC -m3dnow option) + amd3dnow_CFLAGS="-m3dnow" + CFLAGS="$save_CFLAGS $amd3dnow_CFLAGS" + + AC_TRY_COMPILE([ + #include + #ifndef __3dNOW__ + #error Assembler CPP flag not enabled + #endif + ],[ + ],[ + have_gcc_3dnow=yes + ]) + AC_MSG_RESULT($have_gcc_3dnow) + + if test x$have_gcc_3dnow = xyes; then + EXTRA_CFLAGS="$EXTRA_CFLAGS $amd3dnow_CFLAGS" + fi + fi + AC_ARG_ENABLE(sse, AC_HELP_STRING([--enable-sse], [use SSE assembly routines [[default=yes]]]), , enable_sse=yes) @@ -313,6 +342,9 @@ AC_HELP_STRING([--enable-sse], [use SSE assembly routines [[default=yes]]]), AC_TRY_COMPILE([ #include + #ifndef __SSE__ + #error Assembler CPP flag not enabled + #endif ],[ ],[ have_gcc_sse=yes diff --git a/src/video/SDL_blit.h b/src/video/SDL_blit.h index 2ef199f0f..30769471b 100644 --- a/src/video/SDL_blit.h +++ b/src/video/SDL_blit.h @@ -27,6 +27,9 @@ #ifdef __MMX__ #include #endif +#ifdef __3dNOW__ +#include +#endif #ifdef __SSE__ #include #endif diff --git a/src/video/SDL_blit_A.c b/src/video/SDL_blit_A.c index d8369cf57..8e16b1fa6 100644 --- a/src/video/SDL_blit_A.c +++ b/src/video/SDL_blit_A.c @@ -1369,7 +1369,7 @@ BlitRGBtoRGBPixelAlpha(SDL_BlitInfo * info) } } -#ifdef __MMX__ +#ifdef __3dNOW__ /* fast (as in MMX with prefetch) ARGB888->(A)RGB888 blending with pixel alpha */ static void BlitRGBtoRGBPixelAlphaMMX3DNOW(SDL_BlitInfo * info) @@ -2250,17 +2250,21 @@ SDL_CalculateAlphaBlit(SDL_Surface * surface, int blit_index) if (sf->Rmask == df->Rmask && sf->Gmask == df->Gmask && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) { -#ifdef __MMX__ +#if defined(__MMX__) || defined(__3dNOW__) if (sf->Rshift % 8 == 0 && sf->Gshift % 8 == 0 && sf->Bshift % 8 == 0 && sf->Ashift % 8 == 0 && sf->Aloss == 0) { +#ifdef __3dNOW__ if (SDL_Has3DNow()) return BlitRGBtoRGBPixelAlphaMMX3DNOW; +#endif +#ifdef __MMX__ if (SDL_HasMMX()) return BlitRGBtoRGBPixelAlphaMMX; - } #endif + } +#endif /* __MMX__ || __3dNOW__ */ if (sf->Amask == 0xff000000) { #if SDL_ALTIVEC_BLITTERS if (SDL_HasAltiVec())