Commit 522cd2a8 authored by Sam Lantinga's avatar Sam Lantinga

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 ;-)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40779
parent 33e18fa7
...@@ -53,6 +53,10 @@ extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(); ...@@ -53,6 +53,10 @@ extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow();
*/ */
extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(); extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE();
/* This function returns true if the CPU has AltiVec features
*/
extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec();
/* Ends C function definitions when using C++ */ /* Ends C function definitions when using C++ */
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -30,10 +30,15 @@ static char rcsid = ...@@ -30,10 +30,15 @@ static char rcsid =
#include "SDL.h" #include "SDL.h"
#include "SDL_cpuinfo.h" #include "SDL_cpuinfo.h"
#ifdef MACOSX
#include <sys/sysctl.h> /* For AltiVec check */
#endif
#define CPU_HAS_RDTSC 0x00000001 #define CPU_HAS_RDTSC 0x00000001
#define CPU_HAS_MMX 0x00000002 #define CPU_HAS_MMX 0x00000002
#define CPU_HAS_3DNOW 0x00000004 #define CPU_HAS_3DNOW 0x00000004
#define CPU_HAS_SSE 0x00000008 #define CPU_HAS_SSE 0x00000008
#define CPU_HAS_ALTIVEC 0x00000010
static __inline__ int CPU_haveCPUID() static __inline__ int CPU_haveCPUID()
{ {
...@@ -186,6 +191,23 @@ static __inline__ int CPU_haveSSE() ...@@ -186,6 +191,23 @@ static __inline__ int CPU_haveSSE()
return 0; 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_CPUFeatures = 0xFFFFFFFF;
static Uint32 SDL_GetCPUFeatures() static Uint32 SDL_GetCPUFeatures()
...@@ -204,6 +226,9 @@ static Uint32 SDL_GetCPUFeatures() ...@@ -204,6 +226,9 @@ static Uint32 SDL_GetCPUFeatures()
if ( CPU_haveSSE() ) { if ( CPU_haveSSE() ) {
SDL_CPUFeatures |= CPU_HAS_SSE; SDL_CPUFeatures |= CPU_HAS_SSE;
} }
if ( CPU_haveAltiVec() ) {
SDL_CPUFeatures |= CPU_HAS_ALTIVEC;
}
} }
return SDL_CPUFeatures; return SDL_CPUFeatures;
} }
...@@ -240,15 +265,25 @@ SDL_bool SDL_HasSSE() ...@@ -240,15 +265,25 @@ SDL_bool SDL_HasSSE()
return SDL_FALSE; return SDL_FALSE;
} }
SDL_bool SDL_HasAltiVec()
{
if ( SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC ) {
return SDL_TRUE;
}
return SDL_FALSE;
}
#ifdef TEST_MAIN #ifdef TEST_MAIN
#include <stdio.h> #include <stdio.h>
int main() int main()
{ {
printf("RDTSC: %d\n", SDL_HasRDTSC());
printf("MMX: %d\n", SDL_HasMMX()); printf("MMX: %d\n", SDL_HasMMX());
printf("3DNow: %d\n", SDL_Has3DNow()); printf("3DNow: %d\n", SDL_Has3DNow());
printf("SSE: %d\n", SDL_HasSSE()); printf("SSE: %d\n", SDL_HasSSE());
printf("AltiVec: %d\n", SDL_HasAltiVec());
return 0; return 0;
} }
......
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
printf("RDTSC %s\n", SDL_HasRDTSC() ? "detected" : "not detected");
printf("MMX %s\n", SDL_HasMMX() ? "detected" : "not detected"); printf("MMX %s\n", SDL_HasMMX() ? "detected" : "not detected");
printf("3DNow %s\n", SDL_Has3DNow() ? "detected" : "not detected"); printf("3DNow %s\n", SDL_Has3DNow() ? "detected" : "not detected");
printf("SSE %s\n", SDL_HasSSE() ? "detected" : "not detected"); printf("SSE %s\n", SDL_HasSSE() ? "detected" : "not detected");
printf("AltiVec %s\n", SDL_HasAltiVec() ? "detected" : "not detected");
return(0); return(0);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment