diff --git a/include/SDL_cpuinfo.h b/include/SDL_cpuinfo.h index 6d72bbb81..96099a213 100644 --- a/include/SDL_cpuinfo.h +++ b/include/SDL_cpuinfo.h @@ -134,6 +134,11 @@ extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); */ extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); +/** + * This function returns true if the CPU has AVX features. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); + /** * This function returns the amount of RAM configured in the system, in MB. */ diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index c73dd80c1..ebd21bd7d 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -18,7 +18,11 @@ misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ +#ifdef TEST_MAIN +#include "SDL_config.h" +#else #include "../SDL_internal.h" +#endif #if defined(__WIN32__) #include "../core/windows/SDL_windows.h" @@ -55,6 +59,7 @@ #define CPU_HAS_SSE3 0x00000040 #define CPU_HAS_SSE41 0x00000100 #define CPU_HAS_SSE42 0x00000200 +#define CPU_HAS_AVX 0x00000400 #if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__ && !__OpenBSD__ /* This is the brute force way of detecting instruction sets... @@ -329,6 +334,21 @@ CPU_haveSSE42(void) return 0; } +static SDL_INLINE int +CPU_haveAVX(void) +{ + if (CPU_haveCPUID()) { + int a, b, c, d; + + cpuid(1, a, b, c, d); + if (a >= 1) { + cpuid(1, a, b, c, d); + return (c & 0x10000000); + } + } + return 0; +} + static int SDL_CPUCount = 0; int @@ -523,6 +543,9 @@ SDL_GetCPUFeatures(void) if (CPU_haveSSE42()) { SDL_CPUFeatures |= CPU_HAS_SSE42; } + if (CPU_haveAVX()) { + SDL_CPUFeatures |= CPU_HAS_AVX; + } } return SDL_CPUFeatures; } @@ -608,6 +631,15 @@ SDL_HasSSE42(void) return SDL_FALSE; } +SDL_bool +SDL_HasAVX(void) +{ + if (SDL_GetCPUFeatures() & CPU_HAS_AVX) { + return SDL_TRUE; + } + return SDL_FALSE; +} + static int SDL_SystemRAM = 0; int @@ -673,6 +705,7 @@ main() printf("SSE3: %d\n", SDL_HasSSE3()); printf("SSE4.1: %d\n", SDL_HasSSE41()); printf("SSE4.2: %d\n", SDL_HasSSE42()); + printf("AVX: %d\n", SDL_HasAVX()); printf("RAM: %d MB\n", SDL_GetSystemRAM()); return 0; } diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h index f58dde0fe..2d683b6d3 100644 --- a/src/dynapi/SDL_dynapi_overrides.h +++ b/src/dynapi/SDL_dynapi_overrides.h @@ -571,3 +571,4 @@ #define SDL_vsscanf SDL_vsscanf_REAL #define SDL_GameControllerAddMappingsFromRW SDL_GameControllerAddMappingsFromRW_REAL #define SDL_GL_ResetAttributes SDL_GL_ResetAttributes_REAL +#define SDL_HasAVX SDL_HasAVX_REAL diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 8291d2284..93bcf453c 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -600,3 +600,4 @@ SDL_DYNAPI_PROC(void,SDL_GL_DeleteContext,(SDL_GLContext a),(a),) SDL_DYNAPI_PROC(int,SDL_vsscanf,(const char *a, const char *b, va_list c),(a,b,c),return) SDL_DYNAPI_PROC(int,SDL_GameControllerAddMappingsFromRW,(SDL_RWops *a, int b),(a,b),return) SDL_DYNAPI_PROC(void,SDL_GL_ResetAttributes,(void),(),) +SDL_DYNAPI_PROC(SDL_bool,SDL_HasAVX,(void),(),return) diff --git a/test/testautomation_platform.c b/test/testautomation_platform.c index 19896b48d..ba7d30369 100644 --- a/test/testautomation_platform.c +++ b/test/testautomation_platform.c @@ -163,6 +163,7 @@ int platform_testGetFunctions (void *arg) * http://wiki.libsdl.org/moin.cgi/SDL_HasSSE3 * http://wiki.libsdl.org/moin.cgi/SDL_HasSSE41 * http://wiki.libsdl.org/moin.cgi/SDL_HasSSE42 + * http://wiki.libsdl.org/moin.cgi/SDL_HasAVX */ int platform_testHasFunctions (void *arg) { @@ -197,6 +198,9 @@ int platform_testHasFunctions (void *arg) ret = SDL_HasSSE42(); SDLTest_AssertPass("SDL_HasSSE42()"); + ret = SDL_HasAVX(); + SDLTest_AssertPass("SDL_HasAVX()"); + return TEST_COMPLETED; } diff --git a/test/testplatform.c b/test/testplatform.c index a8ed39dd2..d3da8a719 100644 --- a/test/testplatform.c +++ b/test/testplatform.c @@ -153,6 +153,7 @@ TestCPUInfo(SDL_bool verbose) SDL_Log("SSE3 %s\n", SDL_HasSSE3()? "detected" : "not detected"); SDL_Log("SSE4.1 %s\n", SDL_HasSSE41()? "detected" : "not detected"); SDL_Log("SSE4.2 %s\n", SDL_HasSSE42()? "detected" : "not detected"); + SDL_Log("AVX %s\n", SDL_HasAVX()? "detected" : "not detected"); SDL_Log("System RAM %d MB\n", SDL_GetSystemRAM()); } return (0);