Skip to content

Commit

Permalink
Fixed bug 2376 - no SDL_HasAVX
Browse files Browse the repository at this point in the history
Haneef Mubarak

AVX is the successor to SSE* and is fairly widely available. As such, it really ought to be detectable.

This functionality ought to be trivial to implement, and not having it means being forced to write an ugly workaround to check for AVX (so that normal SSE can be used if AVX is not available).

Here is an example on detecting AVX from SO (it actually shows ways to cehck for all of teh fancy instructions):

http://stackoverflow.com/questions/6121792/how-to-check-if-a-cpu-supports-the-sse3-instruction-set
  • Loading branch information
slouken committed Feb 2, 2014
1 parent 8ba565f commit 3bd0e90
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/SDL_cpuinfo.h
Expand Up @@ -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.
*/
Expand Down
33 changes: 33 additions & 0 deletions src/cpuinfo/SDL_cpuinfo.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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...
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_overrides.h
Expand Up @@ -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
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_procs.h
Expand Up @@ -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)
4 changes: 4 additions & 0 deletions test/testautomation_platform.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions test/testplatform.c
Expand Up @@ -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);
Expand Down

0 comments on commit 3bd0e90

Please sign in to comment.