utils.c revision 93a458840c77b784fb74738f734ba2c5d22ca7a7
193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell/* 293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * (c) Copyright IBM Corporation 2002 393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * All Rights Reserved. 493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * copy of this software and associated documentation files (the "Software"), 793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * to deal in the Software without restriction, including without limitation 893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * on the rights to use, copy, modify, merge, publish, distribute, sub 993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * license, and/or sell copies of the Software, and to permit persons to whom 1093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * the Software is furnished to do so, subject to the following conditions: 1193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 1293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * The above copyright notice and this permission notice (including the next 1393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * paragraph) shall be included in all copies or substantial portions of the 1493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Software. 1593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 1693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 2093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * USE OR OTHER DEALINGS IN THE SOFTWARE. 2393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * 2493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Authors: 2593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell * Ian Romanick <idr@us.ibm.com> 2693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 2793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell/* $XFree86:$ */ 2893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 2993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include <string.h> 3093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include <stdlib.h> 3193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include "mtypes.h" 3293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include "extensions.h" 3393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include "utils.h" 3493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 3593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#if defined(USE_X86_ASM) 3693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#include "X86/common_x86_asm.h" 3793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#endif 3893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 3993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellunsigned 4093a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwelldriParseDebugString( const char * debug, 4193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell const struct dri_debug_control * control ) 4293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 4393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell unsigned flag; 4493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 4593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 4693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell flag = 0; 4793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( debug != NULL ) { 4893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell while( control->string != NULL ) { 4993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( strstr( debug, control->string ) != NULL ) { 5093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell flag |= control->flag; 5193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 5393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell control++; 5493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 5693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 5793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return flag; 5893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 5993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 6393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellunsigned 6493a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwelldriGetRendererString( char * buffer, const char * hardware_name, 6593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell const char * driver_date, GLuint agp_mode ) 6693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 6793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#ifdef USE_X86_ASM 6893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell char * x86_str = ""; 6993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell char * mmx_str = ""; 7093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell char * tdnow_str = ""; 7193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell char * sse_str = ""; 7293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#endif 7393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell unsigned offset; 7493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 7593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 7693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell offset = sprintf( buffer, "Mesa DRI %s %s", hardware_name, driver_date ); 7793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 7893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Append any AGP-specific information. 7993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 8093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell switch ( agp_mode ) { 8193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 1: 8293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 2: 8393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 4: 8493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell case 8: 8593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell offset += sprintf( & buffer[ offset ], " AGP %ux", agp_mode ); 8693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell break; 8793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 8893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell default: 8993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell break; 9093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 9193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 9293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Append any CPU-specific information. 9393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell */ 9493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#ifdef USE_X86_ASM 9593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( _mesa_x86_cpu_features ) { 9693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell x86_str = " x86"; 9793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 9893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# ifdef USE_MMX_ASM 9993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( cpu_has_mmx ) { 10093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell mmx_str = (cpu_has_mmxext) ? "/MMX+" : "/MMX"; 10193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 10293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# endif 10393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# ifdef USE_3DNOW_ASM 10493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( cpu_has_3dnow ) { 10593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell tdnow_str = (cpu_has_3dnowext) ? "/3DNow!+" : "/3DNow!"; 10693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 10793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# endif 10893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# ifdef USE_SSE_ASM 10993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( cpu_has_xmm ) { 11093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell sse_str = (cpu_has_xmm2) ? "/SSE2" : "/SSE"; 11193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 11293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell# endif 11393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 11493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell offset += sprintf( & buffer[ offset ], "%s%s%s%s", 11593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell x86_str, mmx_str, tdnow_str, sse_str ); 11693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 11793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#elif defined(USE_SPARC_ASM) 11893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 11993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell offset += sprintf( & buffer[ offset ], " Sparc" ); 12093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#endif 12293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return offset; 12493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 12593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 12993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwellvoid driInitExtensions( GLcontext * ctx, 13093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell const char * const extensions_to_enable[], 13193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell GLboolean enable_imaging ) 13293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 13393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell unsigned i; 13493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 13593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if ( enable_imaging ) { 13693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell _mesa_enable_imaging_extensions( ctx ); 13793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 13893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 13993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell for ( i = 0 ; extensions_to_enable[i] != NULL ; i++ ) { 14093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell _mesa_enable_extension( ctx, extensions_to_enable[i] ); 14193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 14293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 14393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 14493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 14593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 14693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 14793a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwellGLboolean 14893a458840c77b784fb74738f734ba2c5d22ca7a7Keith WhitwelldriCheckDriDdxDrmVersions(__DRIscreenPrivate *sPriv, 14993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell const char * driver_name, 15093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell int dri_major, int dri_minor, 15193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell int ddx_major, int ddx_minor, 15293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell int drm_major, int drm_minor) 15393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell{ 15493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell static const char format[] = "%s DRI driver expected %s version %d.%d.x " 15593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell "but got version %d.%d.%d"; 15693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell int major, minor, patch; 15793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 15893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#ifndef _SOLO 15993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Check the DRI version */ 16093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if (XF86DRIQueryVersion(sPriv->display, &major, &minor, &patch)) { 16193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if (major != dri_major || minor < dri_minor) { 16293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell __driUtilMessage(format, "DRI", driver_name, dri_major, dri_minor, 16393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell major, minor, patch); 16493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return GL_FALSE; 16593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 16693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 16793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#else 16893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell (void)major;(void)minor;(void)patch; 16993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell#endif 17093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 17193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Check that the DDX driver version is compatible */ 17293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if (sPriv->ddxMajor != ddx_major || sPriv->ddxMinor < ddx_minor) { 17393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell __driUtilMessage(format, "DDX", driver_name, ddx_major, ddx_minor, 17493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell sPriv->ddxMajor, sPriv->ddxMinor, sPriv->ddxPatch); 17593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return GL_FALSE; 17693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 17793a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 17893a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell /* Check that the DRM driver version is compatible */ 17993a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell if (sPriv->drmMajor != drm_major || sPriv->drmMinor < drm_minor) { 18093a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell __driUtilMessage(format, "DRM", driver_name, drm_major, drm_minor, 18193a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch); 18293a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return GL_FALSE; 18393a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell } 18493a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell 18593a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell return GL_TRUE; 18693a458840c77b784fb74738f734ba2c5d22ca7a7Keith Whitwell} 187