aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoricculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-12-04 21:40:25 +0000
committericculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-12-04 21:40:25 +0000
commit11273ed8d96a39f140f0bd82009e31fe435cc3d7 (patch)
tree1c234b00dc1a224a71054a119186bcfc1bdb1cfd
parent743a8fd50fc698f7a45cf54c89943231cd11b5f3 (diff)
downloadioquake3-aero-11273ed8d96a39f140f0bd82009e31fe435cc3d7.tar.gz
ioquake3-aero-11273ed8d96a39f140f0bd82009e31fe435cc3d7.zip
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
-rw-r--r--code/qcommon/common.c30
-rw-r--r--code/qcommon/qcommon.h2
-rw-r--r--code/unix/unix_main.c14
-rw-r--r--code/win32/win_main.c7
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;