comparison src/cpuinfo/SDL_cpuinfo.c @ 778:8ac3f46f9d09

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 ;-)
author Sam Lantinga <slouken@libsdl.org>
date Tue, 06 Jan 2004 17:18:38 +0000
parents b8d311d90021
children a2dde6aff60e
comparison
equal deleted inserted replaced
777:6f4fe7f2063b 778:8ac3f46f9d09
28 /* CPU feature detection for SDL */ 28 /* CPU feature detection for SDL */
29 29
30 #include "SDL.h" 30 #include "SDL.h"
31 #include "SDL_cpuinfo.h" 31 #include "SDL_cpuinfo.h"
32 32
33 #ifdef MACOSX
34 #include <sys/sysctl.h> /* For AltiVec check */
35 #endif
36
33 #define CPU_HAS_RDTSC 0x00000001 37 #define CPU_HAS_RDTSC 0x00000001
34 #define CPU_HAS_MMX 0x00000002 38 #define CPU_HAS_MMX 0x00000002
35 #define CPU_HAS_3DNOW 0x00000004 39 #define CPU_HAS_3DNOW 0x00000004
36 #define CPU_HAS_SSE 0x00000008 40 #define CPU_HAS_SSE 0x00000008
41 #define CPU_HAS_ALTIVEC 0x00000010
37 42
38 static __inline__ int CPU_haveCPUID() 43 static __inline__ int CPU_haveCPUID()
39 { 44 {
40 int has_CPUID = 0; 45 int has_CPUID = 0;
41 #if defined(__GNUC__) && defined(i386) 46 #if defined(__GNUC__) && defined(i386)
184 return (CPU_getCPUIDFeatures() & 0x02000000); 189 return (CPU_getCPUIDFeatures() & 0x02000000);
185 } 190 }
186 return 0; 191 return 0;
187 } 192 }
188 193
194 static __inline__ int CPU_haveAltiVec()
195 {
196 #ifdef MACOSX
197 /* TODO: This check works on OS X. It would be nice to detect AltiVec
198 properly on for example Linux/PPC, too. But I don't know how that
199 is done in Linux (or FreeBSD, or whatever other OS you run PPC :-)
200 */
201 int selectors[2] = { CTL_HW, HW_VECTORUNIT };
202 int hasVectorUnit = 0;
203 size_t length = sizeof(hasVectorUnit);
204 int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0);
205 if( 0 == error )
206 return hasVectorUnit != 0;
207 #endif
208 return 0;
209 }
210
189 static Uint32 SDL_CPUFeatures = 0xFFFFFFFF; 211 static Uint32 SDL_CPUFeatures = 0xFFFFFFFF;
190 212
191 static Uint32 SDL_GetCPUFeatures() 213 static Uint32 SDL_GetCPUFeatures()
192 { 214 {
193 if ( SDL_CPUFeatures == 0xFFFFFFFF ) { 215 if ( SDL_CPUFeatures == 0xFFFFFFFF ) {
202 SDL_CPUFeatures |= CPU_HAS_3DNOW; 224 SDL_CPUFeatures |= CPU_HAS_3DNOW;
203 } 225 }
204 if ( CPU_haveSSE() ) { 226 if ( CPU_haveSSE() ) {
205 SDL_CPUFeatures |= CPU_HAS_SSE; 227 SDL_CPUFeatures |= CPU_HAS_SSE;
206 } 228 }
229 if ( CPU_haveAltiVec() ) {
230 SDL_CPUFeatures |= CPU_HAS_ALTIVEC;
231 }
207 } 232 }
208 return SDL_CPUFeatures; 233 return SDL_CPUFeatures;
209 } 234 }
210 235
211 SDL_bool SDL_HasRDTSC() 236 SDL_bool SDL_HasRDTSC()
238 return SDL_TRUE; 263 return SDL_TRUE;
239 } 264 }
240 return SDL_FALSE; 265 return SDL_FALSE;
241 } 266 }
242 267
268 SDL_bool SDL_HasAltiVec()
269 {
270 if ( SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC ) {
271 return SDL_TRUE;
272 }
273 return SDL_FALSE;
274 }
275
243 #ifdef TEST_MAIN 276 #ifdef TEST_MAIN
244 277
245 #include <stdio.h> 278 #include <stdio.h>
246 279
247 int main() 280 int main()
248 { 281 {
282 printf("RDTSC: %d\n", SDL_HasRDTSC());
249 printf("MMX: %d\n", SDL_HasMMX()); 283 printf("MMX: %d\n", SDL_HasMMX());
250 printf("3DNow: %d\n", SDL_Has3DNow()); 284 printf("3DNow: %d\n", SDL_Has3DNow());
251 printf("SSE: %d\n", SDL_HasSSE()); 285 printf("SSE: %d\n", SDL_HasSSE());
286 printf("AltiVec: %d\n", SDL_HasAltiVec());
252 return 0; 287 return 0;
253 } 288 }
254 289
255 #endif /* TEST_MAIN */ 290 #endif /* TEST_MAIN */