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();
*/
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
}
......
......@@ -30,10 +30,15 @@ static char rcsid =
#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 @@ static __inline__ int CPU_haveSSE()
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 @@ static Uint32 SDL_GetCPUFeatures()
if ( CPU_haveSSE() ) {
SDL_CPUFeatures |= CPU_HAS_SSE;
}
if ( CPU_haveAltiVec() ) {
SDL_CPUFeatures |= CPU_HAS_ALTIVEC;
}
}
return SDL_CPUFeatures;
}
......@@ -240,15 +265,25 @@ SDL_bool SDL_HasSSE()
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;
}
......
......@@ -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);
}
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