Skip to content

Commit

Permalink
Date: Tue, 6 Jan 2004 12:42:19 +0100
Browse files Browse the repository at this point in the history
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 ;-)
  • Loading branch information
slouken committed Jan 6, 2004
1 parent f87c871 commit 798506e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
4 changes: 4 additions & 0 deletions include/SDL_cpuinfo.h
Expand Up @@ -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
}
Expand Down
35 changes: 35 additions & 0 deletions src/cpuinfo/SDL_cpuinfo.c
Expand Up @@ -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()
{
Expand Down Expand Up @@ -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()
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions test/testcpuinfo.c
Expand Up @@ -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);
}

0 comments on commit 798506e

Please sign in to comment.