mesa: refactor x86 code
authorBrian Paul <brianp@vmware.com>
Wed, 4 Mar 2009 22:21:13 +0000 (15:21 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 4 Mar 2009 22:24:03 +0000 (15:24 -0700)
Move _mesa_init_all_x86_transform_asm() into x86.c so that common_x86.c
has no dependencies on the vertex transformation code.
Plus some comments and clean-ups.

src/mesa/x86/common_x86.c
src/mesa/x86/common_x86_asm.h
src/mesa/x86/x86.c

index 5321547935878e4291666ae17df344900c6dd98d..18b1c2243cea5fdd6f0ee695224a9d06ca8288ab 100644 (file)
 #include "common_x86_asm.h"
 
 
-int _mesa_x86_cpu_features = 0;
+/** Bitmask of X86_FEATURE_x bits */
+int _mesa_x86_cpu_features = 0x0;
+
+
 
 /* No reason for this to be public.
  */
@@ -73,9 +76,12 @@ extern GLuint        _ASMAPI _mesa_x86_cpuid_edx(GLuint op);
  * kernels provide full SSE support on all processors that expose SSE via
  * the CPUID mechanism.
  */
+
+/* These are assembly functions: */
 extern void _mesa_test_os_sse_support( void );
 extern void _mesa_test_os_sse_exception_support( void );
 
+
 #if defined(WIN32)
 #ifndef STATUS_FLOAT_MULTIPLE_TRAPS
 # define STATUS_FLOAT_MULTIPLE_TRAPS (0xC00002B5L)
@@ -107,7 +113,11 @@ static LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS exp)
 #endif /* WIN32 */
 
 
-static void check_os_sse_support( void )
+/**
+ * Check if SSE is supported.
+ * If not, turn off the X86_FEATURE_XMM flag in _mesa_x86_cpu_features.
+ */
+void _mesa_check_os_sse_support( void )
 {
 #if defined(__FreeBSD__)
    {
@@ -187,10 +197,18 @@ static void check_os_sse_support( void )
 #endif /* USE_SSE_ASM */
 
 
-void _mesa_init_all_x86_transform_asm( void )
+/**
+ * Initialize the _mesa_x86_cpu_features bitfield.
+ */
+void
+_mesa_get_x86_features(void)
 {
 #ifdef USE_X86_ASM
-   _mesa_x86_cpu_features = 0;
+   _mesa_x86_cpu_features = 0x0;
+
+   if (_mesa_getenv( "MESA_NO_ASM")) {
+      return;
+   }
 
    if (!_mesa_x86_has_cpuid()) {
        _mesa_debug(NULL, "CPUID not detected\n");
@@ -263,52 +281,5 @@ void _mesa_init_all_x86_transform_asm( void )
        }
 
    }
-   
-   if ( _mesa_getenv( "MESA_NO_ASM" ) ) {
-      _mesa_x86_cpu_features = 0;
-   }
-
-   if ( _mesa_x86_cpu_features ) {
-      _mesa_init_x86_transform_asm();
-   }
-
-#ifdef USE_MMX_ASM
-   if ( cpu_has_mmx ) {
-      if ( _mesa_getenv( "MESA_NO_MMX" ) == 0 ) {
-         _mesa_debug(NULL, "MMX cpu detected.\n");
-      } else {
-         _mesa_x86_cpu_features &= ~(X86_FEATURE_MMX);
-      }
-   }
-#endif
-
-#ifdef USE_3DNOW_ASM
-   if ( cpu_has_3dnow ) {
-      if ( _mesa_getenv( "MESA_NO_3DNOW" ) == 0 ) {
-         _mesa_debug(NULL, "3DNow! cpu detected.\n");
-         _mesa_init_3dnow_transform_asm();
-      } else {
-         _mesa_x86_cpu_features &= ~(X86_FEATURE_3DNOW);
-      }
-   }
-#endif
-
-#ifdef USE_SSE_ASM
-   if ( cpu_has_xmm ) {
-      if ( _mesa_getenv( "MESA_NO_SSE" ) == 0 ) {
-         _mesa_debug(NULL, "SSE cpu detected.\n");
-         if ( _mesa_getenv( "MESA_FORCE_SSE" ) == 0 ) {
-            check_os_sse_support();
-         }
-         if ( cpu_has_xmm ) {
-            _mesa_init_sse_transform_asm();
-         }
-      } else {
-         _mesa_debug(NULL, "SSE cpu detected, but switched off by user.\n");
-         _mesa_x86_cpu_features &= ~(X86_FEATURE_XMM);
-      }
-   }
-#endif
-#endif
+#endif /* USE_X86_ASM */
 }
-
index 89312b2437989f82335455e76c823c423d4ce602..c7cd11ab0528796d2e84e687b5912b4fbabd4bef 100644 (file)
 
 extern int _mesa_x86_cpu_features;
 
+extern void _mesa_get_x86_features(void);
+
+extern void _mesa_check_os_sse_support(void);
+
 extern void _mesa_init_all_x86_transform_asm( void );
 
 #endif
index ce649f66b0b6a135363429b78a6203fd20e25c14..c2df5e31e6e82bbaaf5502163b522a90d9287a64 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "x86.h"
 #include "common_x86_macros.h"
+#include "common_x86_asm.h"
 
 #ifdef DEBUG_MATH
 #include "math/m_debug.h"
@@ -93,3 +94,52 @@ void _mesa_init_x86_transform_asm( void )
 #endif
 }
 
+
+void _mesa_init_all_x86_transform_asm( void )
+{
+   _mesa_get_x86_features();
+
+#ifdef USE_X86_ASM
+   if ( _mesa_x86_cpu_features ) {
+      _mesa_init_x86_transform_asm();
+   }
+
+#ifdef USE_MMX_ASM
+   if ( cpu_has_mmx ) {
+      if ( _mesa_getenv( "MESA_NO_MMX" ) == 0 ) {
+         _mesa_debug(NULL, "MMX cpu detected.\n");
+      } else {
+         _mesa_x86_cpu_features &= ~(X86_FEATURE_MMX);
+      }
+   }
+#endif
+
+#ifdef USE_3DNOW_ASM
+   if ( cpu_has_3dnow ) {
+      if ( _mesa_getenv( "MESA_NO_3DNOW" ) == 0 ) {
+         _mesa_debug(NULL, "3DNow! cpu detected.\n");
+         _mesa_init_3dnow_transform_asm();
+      } else {
+         _mesa_x86_cpu_features &= ~(X86_FEATURE_3DNOW);
+      }
+   }
+#endif
+
+#ifdef USE_SSE_ASM
+   if ( cpu_has_xmm ) {
+      if ( _mesa_getenv( "MESA_NO_SSE" ) == 0 ) {
+         _mesa_debug(NULL, "SSE cpu detected.\n");
+         if ( _mesa_getenv( "MESA_FORCE_SSE" ) == 0 ) {
+            _mesa_check_os_sse_support();
+         }
+         if ( cpu_has_xmm ) {
+            _mesa_init_sse_transform_asm();
+         }
+      } else {
+         _mesa_debug(NULL, "SSE cpu detected, but switched off by user.\n");
+         _mesa_x86_cpu_features &= ~(X86_FEATURE_XMM);
+      }
+   }
+#endif
+#endif
+}