From 11273ed8d96a39f140f0bd82009e31fe435cc3d7 Mon Sep 17 00:00:00 2001 From: icculus Date: Sun, 4 Dec 2005 21:40:25 +0000 Subject: Better altivec cvar handling. Should fix crashes at startup, or curious people that toggle it on at runtime on a G3. git-svn-id: svn://svn.icculus.org/quake3/trunk@410 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/qcommon/common.c | 30 ++++++++++++++++++++++++++++-- code/qcommon/qcommon.h | 2 ++ code/unix/unix_main.c | 14 +++++--------- code/win32/win_main.c | 7 +++++++ 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/code/qcommon/common.c b/code/qcommon/common.c index 690d5bd..3839f7b 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -2353,6 +2353,24 @@ out: #endif +static void Com_DetectAltivec(void) +{ + // Only detect if user hasn't forcibly disabled it. + if (com_altivec->integer) { + static qboolean altivec = qfalse; + static qboolean detected = qfalse; + if (!detected) { + altivec = Sys_DetectAltivec(); + detected = qtrue; + } + + if (!altivec) { + Cvar_Set( "com_altivec", "0" ); // we don't have it! Disable support! + } + } +} + + /* ================= Com_Init @@ -2510,9 +2528,11 @@ void Com_Init( char *commandLine ) { com_fullyInitialized = qtrue; - #if idppc_altivec + // always set the cvar, but only print the info if it makes sense. + Com_DetectAltivec(); + #if idppc Com_Printf ("Altivec support is %s\n", com_altivec->integer ? "enabled" : "disabled"); - #endif + #endif Com_Printf ("--- Common Initialization Complete ---\n"); } @@ -2713,6 +2733,12 @@ void Com_Frame( void ) { } while ( msec < minMsec ); Cbuf_Execute (); + if (com_altivec->modified) + { + Com_DetectAltivec(); + com_altivec->modified = qfalse; + } + lastTime = com_frameTime; // mess with msec if needed diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 35e44dd..01f4564 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -1033,6 +1033,8 @@ unsigned int Sys_ProcessorCount( void ); int Sys_MonkeyShouldBeSpanked( void ); +qboolean Sys_DetectAltivec( void ); + /* This is based on the Adaptive Huffman algorithm described in Sayood's Data * Compression book. The ranks are not actually stored, but implicitly defined * by the location of a node within a doubly-linked list */ diff --git a/code/unix/unix_main.c b/code/unix/unix_main.c index f347027..87ee005 100644 --- a/code/unix/unix_main.c +++ b/code/unix/unix_main.c @@ -377,12 +377,11 @@ static void illegal_instruction(int sig) } #endif -static void Sys_DetectAltivec(void) +qboolean Sys_DetectAltivec( void ) { - // Only detect if user hasn't forcibly disabled it. - if (com_altivec->integer) { -#if idppc_altivec qboolean altivec = qfalse; + +#if idppc_altivec #ifdef MACOS_X long feat = 0; OSErr err = Gestalt(gestaltPowerPCProcessorFeatures, &feat); @@ -401,12 +400,9 @@ static void Sys_DetectAltivec(void) } signal(SIGILL, handler); #endif - - if (!altivec) { - Cvar_Set( "com_altivec", "0" ); // we don't have it! Disable support! - } #endif - } + + return altivec; } void Sys_Init(void) diff --git a/code/win32/win_main.c b/code/win32/win_main.c index 5f7bddb..ea73fb5 100644 --- a/code/win32/win_main.c +++ b/code/win32/win_main.c @@ -1176,6 +1176,13 @@ void Sys_Init( void ) { } +qboolean Sys_DetectAltivec( void ) +{ + return qfalse; // never altivec on Windows...at least for now. :) +} + + + //======================================================================= int totalMsec, countMsec; -- cgit v1.2.3