#include <machine/cpu.h>
#endif
-#include "common_x86_asm.h"
#include "main/imports.h"
+#include "common_x86_asm.h"
+
+/** Bitmask of X86_FEATURE_x bits */
+int _mesa_x86_cpu_features = 0x0;
-int _mesa_x86_cpu_features = 0;
+static int detection_debug = GL_FALSE;
/* No reason for this to be public.
*/
* 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)
+
+#if defined(_WIN32)
#ifndef STATUS_FLOAT_MULTIPLE_TRAPS
# define STATUS_FLOAT_MULTIPLE_TRAPS (0xC00002B5L)
#endif
return EXCEPTION_CONTINUE_EXECUTION;
}
-#endif /* WIN32 */
+#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__)
{
if (ret || !enabled)
_mesa_x86_cpu_features &= ~(X86_FEATURE_XMM);
}
-#elif defined(WIN32)
+#elif defined(_WIN32)
LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;
/* Install our ExceptionFilter */
#else
/* Do nothing on other platforms for now.
*/
- _mesa_debug(NULL, "Not testing OS support for SSE, leaving enabled.\n");
+ if (detection_debug)
+ _mesa_debug(NULL, "Not testing OS support for SSE, leaving enabled.\n");
#endif /* __FreeBSD__ */
}
#endif /* USE_SSE_ASM */
-void _mesa_init_all_x86_transform_asm( void )
+/**
+ * Initialize the _mesa_x86_cpu_features bitfield.
+ * This is a no-op if called more than once.
+ */
+void
+_mesa_get_x86_features(void)
{
+ static int called = 0;
+
+ if (called)
+ return;
+
+ called = 1;
+
#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");
_mesa_x86_cpuid(0, &result, (GLuint *)(cpu_vendor + 0), (GLuint *)(cpu_vendor + 8), (GLuint *)(cpu_vendor + 4));
cpu_vendor[12] = '\0';
- _mesa_debug(NULL, "CPU vendor: %s\n", cpu_vendor);
+ if (detection_debug)
+ _mesa_debug(NULL, "CPU vendor: %s\n", cpu_vendor);
/* get cpu features */
cpu_features = _mesa_x86_cpuid_edx(1);
_mesa_x86_cpuid(0x80000002+ofs, (GLuint *)(cpu_name + (16*ofs)+0), (GLuint *)(cpu_name + (16*ofs)+4), (GLuint *)(cpu_name + (16*ofs)+8), (GLuint *)(cpu_name + (16*ofs)+12));
cpu_name[48] = '\0'; /* the name should be NULL terminated, but just to be sure */
- _mesa_debug(NULL, "CPU name: %s\n", cpu_name);
+ if (detection_debug)
+ _mesa_debug(NULL, "CPU name: %s\n", cpu_name);
}
}
}
-
- 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");
+ if (detection_debug)
+ _mesa_debug(NULL, "MMX cpu detected.\n");
} else {
_mesa_x86_cpu_features &= ~(X86_FEATURE_MMX);
}
#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();
+ if (detection_debug)
+ _mesa_debug(NULL, "3DNow! cpu detected.\n");
} else {
_mesa_x86_cpu_features &= ~(X86_FEATURE_3DNOW);
}
#ifdef USE_SSE_ASM
if ( cpu_has_xmm ) {
if ( _mesa_getenv( "MESA_NO_SSE" ) == 0 ) {
- _mesa_debug(NULL, "SSE cpu detected.\n");
+ if (detection_debug)
+ _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();
+ _mesa_check_os_sse_support();
}
} else {
_mesa_debug(NULL, "SSE cpu detected, but switched off by user.\n");
}
}
#endif
-#endif
-}
+#endif /* USE_X86_ASM */
+
+ (void) detection_debug;
+}