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();
|
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 =
|
||||||
#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()
|
||||||
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()
|
||||||
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()
|
||||||
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 @@
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue