Mercurial > sdl-ios-xcode
diff src/cpuinfo/SDL_cpuinfo.c @ 778:8ac3f46f9d09
Date: Tue, 6 Jan 2004 12:42:19 +0100
From: Max Horn
Subject: SDL_HasAltiVec; BUGS file
the attached patch adds SDL_HasAltiVec to SDL CVS. Note that at this
point, this only works on MacOSX (and maybe darwin). I don't know how
to properly add a test for e.g. Linux/PPC at this point. I found an
email which might help in doing so:
http://zebra.fh-weingarten.de/~maxi/html/mplayer-dev-eng/2003-01msg00783.html
However, since I have no way to test on a non-OSX PowerPC system, I am
not comfortable blindly adding such code... I just hope that if
somebody from the Linux/PPC (or FreeBSD/PPC, or whatever) community
notices this, they'll jump up and provide a patch for us ;-)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 06 Jan 2004 17:18:38 +0000 |
parents | b8d311d90021 |
children | a2dde6aff60e |
line wrap: on
line diff
--- a/src/cpuinfo/SDL_cpuinfo.c Tue Jan 06 17:16:02 2004 +0000 +++ b/src/cpuinfo/SDL_cpuinfo.c Tue Jan 06 17:18:38 2004 +0000 @@ -30,10 +30,15 @@ #include "SDL.h" #include "SDL_cpuinfo.h" +#ifdef MACOSX +#include <sys/sysctl.h> /* For AltiVec check */ +#endif + #define CPU_HAS_RDTSC 0x00000001 #define CPU_HAS_MMX 0x00000002 #define CPU_HAS_3DNOW 0x00000004 #define CPU_HAS_SSE 0x00000008 +#define CPU_HAS_ALTIVEC 0x00000010 static __inline__ int CPU_haveCPUID() { @@ -186,6 +191,23 @@ return 0; } +static __inline__ int CPU_haveAltiVec() +{ +#ifdef MACOSX + /* TODO: This check works on OS X. It would be nice to detect AltiVec + properly on for example Linux/PPC, too. But I don't know how that + is done in Linux (or FreeBSD, or whatever other OS you run PPC :-) + */ + int selectors[2] = { CTL_HW, HW_VECTORUNIT }; + int hasVectorUnit = 0; + size_t length = sizeof(hasVectorUnit); + int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); + if( 0 == error ) + return hasVectorUnit != 0; +#endif + return 0; +} + static Uint32 SDL_CPUFeatures = 0xFFFFFFFF; static Uint32 SDL_GetCPUFeatures() @@ -204,6 +226,9 @@ if ( CPU_haveSSE() ) { SDL_CPUFeatures |= CPU_HAS_SSE; } + if ( CPU_haveAltiVec() ) { + SDL_CPUFeatures |= CPU_HAS_ALTIVEC; + } } return SDL_CPUFeatures; } @@ -240,15 +265,25 @@ return SDL_FALSE; } +SDL_bool SDL_HasAltiVec() +{ + if ( SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC ) { + return SDL_TRUE; + } + return SDL_FALSE; +} + #ifdef TEST_MAIN #include <stdio.h> int main() { + printf("RDTSC: %d\n", SDL_HasRDTSC()); printf("MMX: %d\n", SDL_HasMMX()); printf("3DNow: %d\n", SDL_Has3DNow()); printf("SSE: %d\n", SDL_HasSSE()); + printf("AltiVec: %d\n", SDL_HasAltiVec()); return 0; }