Date: Tue, 6 Jan 2004 12:42:19 +0100
authorSam Lantinga <slouken@libsdl.org>
Tue, 06 Jan 2004 17:18:38 +0000
changeset 778 8ac3f46f9d09
parent 777 6f4fe7f2063b
child 779 68c8da837fc0
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 ;-)
include/SDL_cpuinfo.h
src/cpuinfo/SDL_cpuinfo.c
test/testcpuinfo.c
--- 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);
 }