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