X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fx86%2Fcommon_x86.c;h=90fa7e48ff35c9760715a9cff54169b39495f71c;hb=ea93e6d3785cdcd17da1d7cc47a394ba684735db;hp=ba3a54ca4be4a5c56dae95ed2c85dcb4fa4301e1;hpb=a5455bb374571833080fcbd6728edcba13d45b38;p=mesa.git diff --git a/src/mesa/x86/common_x86.c b/src/mesa/x86/common_x86.c index ba3a54ca4be..90fa7e48ff3 100644 --- a/src/mesa/x86/common_x86.c +++ b/src/mesa/x86/common_x86.c @@ -1,10 +1,8 @@ -/* $Id: common_x86.c,v 1.16 2001/06/06 18:12:35 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 6.0.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -30,25 +28,32 @@ * * Written by Holger Waechtler * Changed by Andre Werthmann for using the - * new Katmai functions. + * new SSE functions. */ -#include -#include +/* XXX these includes should probably go into imports.h or glheader.h */ #if defined(USE_SSE_ASM) && defined(__linux__) #include #endif +#if defined(USE_SSE_ASM) && defined(__FreeBSD__) +#include +#include +#endif -#include "context.h" #include "common_x86_asm.h" +#include "imports.h" int _mesa_x86_cpu_features = 0; /* No reason for this to be public. */ -extern int _mesa_identify_x86_cpu_features( void ); - +extern GLuint _ASMAPI _mesa_x86_has_cpuid(void); +extern void _ASMAPI _mesa_x86_cpuid(GLuint op, GLuint *reg_eax, GLuint *reg_ebx, GLuint *reg_ecx, GLuint *reg_edx); +extern GLuint _ASMAPI _mesa_x86_cpuid_eax(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_ebx(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_ecx(GLuint op); +extern GLuint _ASMAPI _mesa_x86_cpuid_edx(GLuint op); static void message( const char *msg ) { @@ -56,7 +61,7 @@ static void message( const char *msg ) #ifdef DEBUG debug = GL_TRUE; #else - if ( getenv( "MESA_DEBUG" ) ) { + if ( _mesa_getenv( "MESA_DEBUG" ) ) { debug = GL_TRUE; } else { debug = GL_FALSE; @@ -213,8 +218,16 @@ static void check_os_sse_support( void ) message( "Cannot test OS support for SSE, disabling to be safe.\n" ); _mesa_x86_cpu_features &= ~(X86_FEATURE_XMM); #endif /* _POSIX_SOURCE && X86_FXSR_MAGIC */ +#elif defined(__FreeBSD__) + { + int ret, len, enabled; + len = sizeof(enabled); + ret = sysctlbyname("hw.instruction_sse", &enabled, &len, NULL, 0); + if (ret || !enabled) + _mesa_x86_cpu_features &= ~(X86_FEATURE_XMM); + } #else - /* Do nothing on non-Linux platforms for now. + /* Do nothing on other platforms for now. */ message( "Not testing OS support for SSE, leaving enabled.\n" ); #endif /* __linux__ */ @@ -225,10 +238,87 @@ static void check_os_sse_support( void ) void _mesa_init_all_x86_transform_asm( void ) { + (void) message; /* silence warning */ #ifdef USE_X86_ASM - _mesa_x86_cpu_features = _mesa_identify_x86_cpu_features(); + _mesa_x86_cpu_features = 0; + + if (!_mesa_x86_has_cpuid()) { + message("CPUID not detected"); + } + else { + GLuint cpu_features; + GLuint cpu_ext_features; + GLuint cpu_ext_info; + char cpu_vendor[13]; + GLuint result; + + /* get vendor name */ + _mesa_x86_cpuid(0, &result, (GLuint *)(cpu_vendor + 0), (GLuint *)(cpu_vendor + 8), (GLuint *)(cpu_vendor + 4)); + cpu_vendor[12] = '\0'; + + message("cpu vendor: "); + message(cpu_vendor); + message("\n"); + + /* get cpu features */ + cpu_features = _mesa_x86_cpuid_edx(1); + + if (cpu_features & X86_CPU_FPU) + _mesa_x86_cpu_features |= X86_FEATURE_FPU; + if (cpu_features & X86_CPU_CMOV) + _mesa_x86_cpu_features |= X86_FEATURE_CMOV; + +#ifdef USE_MMX_ASM + if (cpu_features & X86_CPU_MMX) + _mesa_x86_cpu_features |= X86_FEATURE_MMX; +#endif + +#ifdef USE_SSE_ASM + if (cpu_features & X86_CPU_XMM) + _mesa_x86_cpu_features |= X86_FEATURE_XMM; + if (cpu_features & X86_CPU_XMM2) + _mesa_x86_cpu_features |= X86_FEATURE_XMM2; +#endif + + /* query extended cpu features */ + if ((cpu_ext_info = _mesa_x86_cpuid_eax(0x80000000)) > 0x80000000) { + if (cpu_ext_info >= 0x80000001) { + + cpu_ext_features = _mesa_x86_cpuid_edx(0x80000001); + + if (cpu_features & X86_CPU_MMX) { + +#ifdef USE_3DNOW_ASM + if (cpu_ext_features & X86_CPUEXT_3DNOW) + _mesa_x86_cpu_features |= X86_FEATURE_3DNOW; + if (cpu_ext_features & X86_CPUEXT_3DNOW_EXT) + _mesa_x86_cpu_features |= X86_FEATURE_3DNOWEXT; +#endif + +#ifdef USE_MMX_ASM + if (cpu_ext_features & X86_CPUEXT_MMX_EXT) + _mesa_x86_cpu_features |= X86_FEATURE_MMXEXT; +#endif + } + } + + /* query cpu name */ + if (cpu_ext_info >= 0x80000002) { + GLuint ofs; + char cpu_name[49]; + for (ofs = 0; ofs < 3; ofs++) + _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 */ + + message("cpu name: "); + message(cpu_name); + message("\n"); + } + } - if ( getenv( "MESA_NO_ASM" ) ) { + } + + if ( _mesa_getenv( "MESA_NO_ASM" ) ) { _mesa_x86_cpu_features = 0; } @@ -238,7 +328,7 @@ void _mesa_init_all_x86_transform_asm( void ) #ifdef USE_MMX_ASM if ( cpu_has_mmx ) { - if ( getenv( "MESA_NO_MMX" ) == 0 ) { + if ( _mesa_getenv( "MESA_NO_MMX" ) == 0 ) { message( "MMX cpu detected.\n" ); } else { _mesa_x86_cpu_features &= ~(X86_FEATURE_MMX); @@ -248,7 +338,7 @@ void _mesa_init_all_x86_transform_asm( void ) #ifdef USE_3DNOW_ASM if ( cpu_has_3dnow ) { - if ( getenv( "MESA_NO_3DNOW" ) == 0 ) { + if ( _mesa_getenv( "MESA_NO_3DNOW" ) == 0 ) { message( "3DNow! cpu detected.\n" ); _mesa_init_3dnow_transform_asm(); } else { @@ -258,14 +348,15 @@ void _mesa_init_all_x86_transform_asm( void ) #endif #ifdef USE_SSE_ASM - if ( cpu_has_xmm && getenv( "MESA_FORCE_SSE" ) == 0 ) { + if ( cpu_has_xmm && _mesa_getenv( "MESA_FORCE_SSE" ) == 0 ) { check_os_sse_support(); } if ( cpu_has_xmm ) { - if ( getenv( "MESA_NO_SSE" ) == 0 ) { + if (_mesa_getenv( "MESA_NO_SSE" ) == 0 ) { message( "SSE cpu detected.\n" ); _mesa_init_sse_transform_asm(); } else { + message( "SSE cpu detected, but switched off by user.\n" ); _mesa_x86_cpu_features &= ~(X86_FEATURE_XMM); } } @@ -273,26 +364,3 @@ void _mesa_init_all_x86_transform_asm( void ) #endif } -/* Note: the above function must be called before this one, so that - * _mesa_x86_cpu_features gets correctly initialized. - */ -void _mesa_init_all_x86_vertex_asm( void ) -{ -#ifdef USE_X86_ASM - if ( _mesa_x86_cpu_features ) { - _mesa_init_x86_vertex_asm(); - } - -#ifdef USE_3DNOW_ASM - if ( cpu_has_3dnow && getenv( "MESA_NO_3DNOW" ) == 0 ) { - _mesa_init_3dnow_vertex_asm(); - } -#endif - -#ifdef USE_SSE_ASM - if ( cpu_has_xmm && getenv( "MESA_NO_SSE" ) == 0 ) { - _mesa_init_sse_vertex_asm(); - } -#endif -#endif -}