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
This commit is contained in:
parent
33e18fa7f9
commit
522cd2a8c4
3 changed files with 41 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue