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 ;-)
--- a/include/SDL_cpuinfo.h Tue Jan 06 17:16:02 2004 +0000
+++ b/include/SDL_cpuinfo.h Tue Jan 06 17:18:38 2004 +0000
@@ -53,6 +53,10 @@
*/
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++ */
#ifdef __cplusplus
}
--- 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;
}
--- a/test/testcpuinfo.c Tue Jan 06 17:16:02 2004 +0000
+++ b/test/testcpuinfo.c Tue Jan 06 17:18:38 2004 +0000
@@ -8,8 +8,10 @@
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("3DNow %s\n", SDL_Has3DNow() ? "detected" : "not detected");
printf("SSE %s\n", SDL_HasSSE() ? "detected" : "not detected");
+ printf("AltiVec %s\n", SDL_HasAltiVec() ? "detected" : "not detected");
return(0);
}