gallium: Make the intel xorg winsys start up with any Intel chipset.
[mesa.git] / progs / tests / getprocaddress.c
index e80b9dbab36151227420ee2918c804cb52b8759f..ca66025d2dcc19a919018ac71b1a892ddca32a89 100644 (file)
@@ -1,7 +1,5 @@
-/* $Id: getprocaddress.c,v 1.3 2002/10/15 14:43:55 brianp Exp $ */
-
 /*
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  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"),
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
+
+
+typedef void (*generic_func)();
 
+#define EQUAL(X, Y)  (fabs((X) - (Y)) < 0.001)
 
-/* This big list of functions can be generated automatically by
- * running the functions.py script.
+/**
+ * The following functions are used to check that the named OpenGL function
+ * actually does what it's supposed to do.
+ * The naming of these functions is signficant.  The getprocaddress.py script
+ * scans this file and extracts these function names.
  */
-static const char *functions[] = {
-   "-1.0",
-   "glNewList",
-   "glEndList",
-   "glCallList",
-   "glCallLists",
-   "glDeleteLists",
-   "glGenLists",
-   "glListBase",
-   "glBegin",
-   "glBitmap",
-   "glColor3b",
-   "glColor3bv",
-   "glColor3d",
-   "glColor3dv",
-   "glColor3f",
-   "glColor3fv",
-   "glColor3i",
-   "glColor3iv",
-   "glColor3s",
-   "glColor3sv",
-   "glColor3ub",
-   "glColor3ubv",
-   "glColor3ui",
-   "glColor3uiv",
-   "glColor3us",
-   "glColor3usv",
-   "glColor4b",
-   "glColor4bv",
-   "glColor4d",
-   "glColor4dv",
-   "glColor4f",
-   "glColor4fv",
-   "glColor4i",
-   "glColor4iv",
-   "glColor4s",
-   "glColor4sv",
-   "glColor4ub",
-   "glColor4ubv",
-   "glColor4ui",
-   "glColor4uiv",
-   "glColor4us",
-   "glColor4usv",
-   "glEdgeFlag",
-   "glEdgeFlagv",
-   "glEnd",
-   "glIndexd",
-   "glIndexdv",
-   "glIndexf",
-   "glIndexfv",
-   "glIndexi",
-   "glIndexiv",
-   "glIndexs",
-   "glIndexsv",
-   "glNormal3b",
-   "glNormal3bv",
-   "glNormal3d",
-   "glNormal3dv",
-   "glNormal3f",
-   "glNormal3fv",
-   "glNormal3i",
-   "glNormal3iv",
-   "glNormal3s",
-   "glNormal3sv",
-   "glRasterPos2d",
-   "glRasterPos2dv",
-   "glRasterPos2f",
-   "glRasterPos2fv",
-   "glRasterPos2i",
-   "glRasterPos2iv",
-   "glRasterPos2s",
-   "glRasterPos2sv",
-   "glRasterPos3d",
-   "glRasterPos3dv",
-   "glRasterPos3f",
-   "glRasterPos3fv",
-   "glRasterPos3i",
-   "glRasterPos3iv",
-   "glRasterPos3s",
-   "glRasterPos3sv",
-   "glRasterPos4d",
-   "glRasterPos4dv",
-   "glRasterPos4f",
-   "glRasterPos4fv",
-   "glRasterPos4i",
-   "glRasterPos4iv",
-   "glRasterPos4s",
-   "glRasterPos4sv",
-   "glRectd",
-   "glRectdv",
-   "glRectf",
-   "glRectfv",
-   "glRecti",
-   "glRectiv",
-   "glRects",
-   "glRectsv",
-   "glTexCoord1d",
-   "glTexCoord1dv",
-   "glTexCoord1f",
-   "glTexCoord1fv",
-   "glTexCoord1i",
-   "glTexCoord1iv",
-   "glTexCoord1s",
-   "glTexCoord1sv",
-   "glTexCoord2d",
-   "glTexCoord2dv",
-   "glTexCoord2f",
-   "glTexCoord2fv",
-   "glTexCoord2i",
-   "glTexCoord2iv",
-   "glTexCoord2s",
-   "glTexCoord2sv",
-   "glTexCoord3d",
-   "glTexCoord3dv",
-   "glTexCoord3f",
-   "glTexCoord3fv",
-   "glTexCoord3i",
-   "glTexCoord3iv",
-   "glTexCoord3s",
-   "glTexCoord3sv",
-   "glTexCoord4d",
-   "glTexCoord4dv",
-   "glTexCoord4f",
-   "glTexCoord4fv",
-   "glTexCoord4i",
-   "glTexCoord4iv",
-   "glTexCoord4s",
-   "glTexCoord4sv",
-   "glVertex2d",
-   "glVertex2dv",
-   "glVertex2f",
-   "glVertex2fv",
-   "glVertex2i",
-   "glVertex2iv",
-   "glVertex2s",
-   "glVertex2sv",
-   "glVertex3d",
-   "glVertex3dv",
-   "glVertex3f",
-   "glVertex3fv",
-   "glVertex3i",
-   "glVertex3iv",
-   "glVertex3s",
-   "glVertex3sv",
-   "glVertex4d",
-   "glVertex4dv",
-   "glVertex4f",
-   "glVertex4fv",
-   "glVertex4i",
-   "glVertex4iv",
-   "glVertex4s",
-   "glVertex4sv",
-   "glClipPlane",
-   "glColorMaterial",
-   "glCullFace",
-   "glFogf",
-   "glFogfv",
-   "glFogi",
-   "glFogiv",
-   "glFrontFace",
-   "glHint",
-   "glLightf",
-   "glLightfv",
-   "glLighti",
-   "glLightiv",
-   "glLightModelf",
-   "glLightModelfv",
-   "glLightModeli",
-   "glLightModeliv",
-   "glLineStipple",
-   "glLineWidth",
-   "glMaterialf",
-   "glMaterialfv",
-   "glMateriali",
-   "glMaterialiv",
-   "glPointSize",
-   "glPolygonMode",
-   "glPolygonStipple",
-   "glScissor",
-   "glShadeModel",
-   "glTexParameterf",
-   "glTexParameterfv",
-   "glTexParameteri",
-   "glTexParameteriv",
-   "glTexImage1D",
-   "glTexImage2D",
-   "glTexEnvf",
-   "glTexEnvfv",
-   "glTexEnvi",
-   "glTexEnviv",
-   "glTexGend",
-   "glTexGendv",
-   "glTexGenf",
-   "glTexGenfv",
-   "glTexGeni",
-   "glTexGeniv",
-   "glFeedbackBuffer",
-   "glSelectBuffer",
-   "glRenderMode",
-   "glInitNames",
-   "glLoadName",
-   "glPassThrough",
-   "glPopName",
-   "glPushName",
-   "glDrawBuffer",
-   "glClear",
-   "glClearAccum",
-   "glClearIndex",
-   "glClearColor",
-   "glClearStencil",
-   "glClearDepth",
-   "glStencilMask",
-   "glColorMask",
-   "glDepthMask",
-   "glIndexMask",
-   "glAccum",
-   "glDisable",
-   "glEnable",
-   "glFinish",
-   "glFlush",
-   "glPopAttrib",
-   "glPushAttrib",
-   "glMap1d",
-   "glMap1f",
-   "glMap2d",
-   "glMap2f",
-   "glMapGrid1d",
-   "glMapGrid1f",
-   "glMapGrid2d",
-   "glMapGrid2f",
-   "glEvalCoord1d",
-   "glEvalCoord1dv",
-   "glEvalCoord1f",
-   "glEvalCoord1fv",
-   "glEvalCoord2d",
-   "glEvalCoord2dv",
-   "glEvalCoord2f",
-   "glEvalCoord2fv",
-   "glEvalMesh1",
-   "glEvalPoint1",
-   "glEvalMesh2",
-   "glEvalPoint2",
-   "glAlphaFunc",
-   "glBlendFunc",
-   "glLogicOp",
-   "glStencilFunc",
-   "glStencilOp",
-   "glDepthFunc",
-   "glPixelZoom",
-   "glPixelTransferf",
-   "glPixelTransferi",
-   "glPixelStoref",
-   "glPixelStorei",
-   "glPixelMapfv",
-   "glPixelMapuiv",
-   "glPixelMapusv",
-   "glReadBuffer",
-   "glCopyPixels",
-   "glReadPixels",
-   "glDrawPixels",
-   "glGetBooleanv",
-   "glGetClipPlane",
-   "glGetDoublev",
-   "glGetError",
-   "glGetFloatv",
-   "glGetIntegerv",
-   "glGetLightfv",
-   "glGetLightiv",
-   "glGetMapdv",
-   "glGetMapfv",
-   "glGetMapiv",
-   "glGetMaterialfv",
-   "glGetMaterialiv",
-   "glGetPixelMapfv",
-   "glGetPixelMapuiv",
-   "glGetPixelMapusv",
-   "glGetPolygonStipple",
-   "glGetString",
-   "glGetTexEnvfv",
-   "glGetTexEnviv",
-   "glGetTexGendv",
-   "glGetTexGenfv",
-   "glGetTexGeniv",
-   "glGetTexImage",
-   "glGetTexParameterfv",
-   "glGetTexParameteriv",
-   "glGetTexLevelParameterfv",
-   "glGetTexLevelParameteriv",
-   "glIsEnabled",
-   "glIsList",
-   "glDepthRange",
-   "glFrustum",
-   "glLoadIdentity",
-   "glLoadMatrixf",
-   "glLoadMatrixd",
-   "glMatrixMode",
-   "glMultMatrixf",
-   "glMultMatrixd",
-   "glOrtho",
-   "glPopMatrix",
-   "glPushMatrix",
-   "glRotated",
-   "glRotatef",
-   "glScaled",
-   "glScalef",
-   "glTranslated",
-   "glTranslatef",
-   "glViewport",
-   "-1.1",
-   "glArrayElement",
-   "glColorPointer",
-   "glDisableClientState",
-   "glDrawArrays",
-   "glDrawElements",
-   "glEdgeFlagPointer",
-   "glEnableClientState",
-   "glGetPointerv",
-   "glIndexPointer",
-   "glInterleavedArrays",
-   "glNormalPointer",
-   "glTexCoordPointer",
-   "glVertexPointer",
-   "glPolygonOffset",
-   "glCopyTexImage1D",
-   "glCopyTexImage2D",
-   "glCopyTexSubImage1D",
-   "glCopyTexSubImage2D",
-   "glTexSubImage1D",
-   "glTexSubImage2D",
-   "glAreTexturesResident",
-   "glBindTexture",
-   "glDeleteTextures",
-   "glGenTextures",
-   "glIsTexture",
-   "glPrioritizeTextures",
-   "glIndexub",
-   "glIndexubv",
-   "glPopClientAttrib",
-   "glPushClientAttrib",
-   "-1.2",
-   "glBlendColor",
-   "glBlendEquation",
-   "glDrawRangeElements",
-   "glColorTable",
-   "glColorTableParameterfv",
-   "glColorTableParameteriv",
-   "glCopyColorTable",
-   "glGetColorTable",
-   "glGetColorTableParameterfv",
-   "glGetColorTableParameteriv",
-   "glColorSubTable",
-   "glCopyColorSubTable",
-   "glConvolutionFilter1D",
-   "glConvolutionFilter2D",
-   "glConvolutionParameterf",
-   "glConvolutionParameterfv",
-   "glConvolutionParameteri",
-   "glConvolutionParameteriv",
-   "glCopyConvolutionFilter1D",
-   "glCopyConvolutionFilter2D",
-   "glGetConvolutionFilter",
-   "glGetConvolutionParameterfv",
-   "glGetConvolutionParameteriv",
-   "glGetSeparableFilter",
-   "glSeparableFilter2D",
-   "glGetHistogram",
-   "glGetHistogramParameterfv",
-   "glGetHistogramParameteriv",
-   "glGetMinmax",
-   "glGetMinmaxParameterfv",
-   "glGetMinmaxParameteriv",
-   "glHistogram",
-   "glMinmax",
-   "glResetHistogram",
-   "glResetMinmax",
-   "glTexImage3D",
-   "glTexSubImage3D",
-   "glCopyTexSubImage3D",
-   "-1.3",
-   "glActiveTexture",
-   "glClientActiveTexture",
-   "glMultiTexCoord1d",
-   "glMultiTexCoord1dv",
-   "glMultiTexCoord1f",
-   "glMultiTexCoord1fv",
-   "glMultiTexCoord1i",
-   "glMultiTexCoord1iv",
-   "glMultiTexCoord1s",
-   "glMultiTexCoord1sv",
-   "glMultiTexCoord2d",
-   "glMultiTexCoord2dv",
-   "glMultiTexCoord2f",
-   "glMultiTexCoord2fv",
-   "glMultiTexCoord2i",
-   "glMultiTexCoord2iv",
-   "glMultiTexCoord2s",
-   "glMultiTexCoord2sv",
-   "glMultiTexCoord3d",
-   "glMultiTexCoord3dv",
-   "glMultiTexCoord3f",
-   "glMultiTexCoord3fv",
-   "glMultiTexCoord3i",
-   "glMultiTexCoord3iv",
-   "glMultiTexCoord3s",
-   "glMultiTexCoord3sv",
-   "glMultiTexCoord4d",
-   "glMultiTexCoord4dv",
-   "glMultiTexCoord4f",
-   "glMultiTexCoord4fv",
-   "glMultiTexCoord4i",
-   "glMultiTexCoord4iv",
-   "glMultiTexCoord4s",
-   "glMultiTexCoord4sv",
-   "glLoadTransposeMatrixf",
-   "glLoadTransposeMatrixd",
-   "glMultTransposeMatrixf",
-   "glMultTransposeMatrixd",
-   "glSampleCoverage",
-   "glCompressedTexImage3D",
-   "glCompressedTexImage2D",
-   "glCompressedTexImage1D",
-   "glCompressedTexSubImage3D",
-   "glCompressedTexSubImage2D",
-   "glCompressedTexSubImage1D",
-   "glGetCompressedTexImage",
-   "-GL_ARB_multitexture",
-   "glActiveTextureARB",
-   "glClientActiveTextureARB",
-   "glMultiTexCoord1dARB",
-   "glMultiTexCoord1dvARB",
-   "glMultiTexCoord1fARB",
-   "glMultiTexCoord1fvARB",
-   "glMultiTexCoord1iARB",
-   "glMultiTexCoord1ivARB",
-   "glMultiTexCoord1sARB",
-   "glMultiTexCoord1svARB",
-   "glMultiTexCoord2dARB",
-   "glMultiTexCoord2dvARB",
-   "glMultiTexCoord2fARB",
-   "glMultiTexCoord2fvARB",
-   "glMultiTexCoord2iARB",
-   "glMultiTexCoord2ivARB",
-   "glMultiTexCoord2sARB",
-   "glMultiTexCoord2svARB",
-   "glMultiTexCoord3dARB",
-   "glMultiTexCoord3dvARB",
-   "glMultiTexCoord3fARB",
-   "glMultiTexCoord3fvARB",
-   "glMultiTexCoord3iARB",
-   "glMultiTexCoord3ivARB",
-   "glMultiTexCoord3sARB",
-   "glMultiTexCoord3svARB",
-   "glMultiTexCoord4dARB",
-   "glMultiTexCoord4dvARB",
-   "glMultiTexCoord4fARB",
-   "glMultiTexCoord4fvARB",
-   "glMultiTexCoord4iARB",
-   "glMultiTexCoord4ivARB",
-   "glMultiTexCoord4sARB",
-   "glMultiTexCoord4svARB",
-   "-GL_ARB_transpose_matrix",
-   "glLoadTransposeMatrixfARB",
-   "glLoadTransposeMatrixdARB",
-   "glMultTransposeMatrixfARB",
-   "glMultTransposeMatrixdARB",
-   "-GL_ARB_multisample",
-   "glSampleCoverageARB",
-   "-unused",
-   "gl__unused413",
-   "-GL_ARB_texture_compression",
-   "glCompressedTexImage3DARB",
-   "glCompressedTexImage2DARB",
-   "glCompressedTexImage1DARB",
-   "glCompressedTexSubImage3DARB",
-   "glCompressedTexSubImage2DARB",
-   "glCompressedTexSubImage1DARB",
-   "glGetCompressedTexImageARB",
-   "-GL_ARB_vertex_blend",
-   "glWeightbvARB",
-   "glWeightsvARB",
-   "glWeightivARB",
-   "glWeightfvARB",
-   "glWeightdvARB",
-   "glWeightubvARB",
-   "glWeightusvARB",
-   "glWeightuivARB",
-   "glWeightPointerARB",
-   "glVertexBlendARB",
-   "-GL_ARB_matrix_palette",
-   "glCurrentPaletteMatrixARB",
-   "glMatrixIndexubvARB",
-   "glMatrixIndexusvARB",
-   "glMatrixIndexuivARB",
-   "glMatrixIndexPointerARB",
-   "-GL_EXT_blend_color",
-   "glBlendColorEXT",
-   "-GL_EXT_polygon_offset",
-   "glPolygonOffsetEXT",
-   "-GL_EXT_texture3D",
-   "glTexImage3DEXT",
-   "glTexSubImage3DEXT",
-   "-GL_SGIS_texture_filter4",
-   "glGetTexFilterFuncSGIS",
-   "glTexFilterFuncSGIS",
-   "-GL_EXT_subtexture",
-   "glTexSubImage1DEXT",
-   "glTexSubImage2DEXT",
-   "-GL_EXT_copy_texture",
-   "glCopyTexImage1DEXT",
-   "glCopyTexImage2DEXT",
-   "glCopyTexSubImage1DEXT",
-   "glCopyTexSubImage2DEXT",
-   "glCopyTexSubImage3DEXT",
-   "-GL_EXT_histogram",
-   "glGetHistogramEXT",
-   "glGetHistogramParameterfvEXT",
-   "glGetHistogramParameterivEXT",
-   "glGetMinmaxEXT",
-   "glGetMinmaxParameterfvEXT",
-   "glGetMinmaxParameterivEXT",
-   "glHistogramEXT",
-   "glMinmaxEXT",
-   "glResetHistogramEXT",
-   "glResetMinmaxEXT",
-   "-GL_EXT_convolution",
-   "glConvolutionFilter1DEXT",
-   "glConvolutionFilter2DEXT",
-   "glConvolutionParameterfEXT",
-   "glConvolutionParameterfvEXT",
-   "glConvolutionParameteriEXT",
-   "glConvolutionParameterivEXT",
-   "glCopyConvolutionFilter1DEXT",
-   "glCopyConvolutionFilter2DEXT",
-   "glGetConvolutionFilterEXT",
-   "glGetConvolutionParameterfvEXT",
-   "glGetConvolutionParameterivEXT",
-   "glGetSeparableFilterEXT",
-   "glSeparableFilter2DEXT",
-   "-GL_SGI_color_table",
-   "glColorTableSGI",
-   "glColorTableParameterfvSGI",
-   "glColorTableParameterivSGI",
-   "glCopyColorTableSGI",
-   "glGetColorTableSGI",
-   "glGetColorTableParameterfvSGI",
-   "glGetColorTableParameterivSGI",
-   "-GL_SGIX_pixel_texture",
-   "glPixelTexGenSGIX",
-   "-GL_SGIS_pixel_texture",
-   "glPixelTexGenParameteriSGIS",
-   "glPixelTexGenParameterivSGIS",
-   "glPixelTexGenParameterfSGIS",
-   "glPixelTexGenParameterfvSGIS",
-   "glGetPixelTexGenParameterivSGIS",
-   "glGetPixelTexGenParameterfvSGIS",
-   "-GL_SGIS_texture4D",
-   "glTexImage4DSGIS",
-   "glTexSubImage4DSGIS",
-   "-GL_EXT_texture_object",
-   "glAreTexturesResidentEXT",
-   "glBindTextureEXT",
-   "glDeleteTexturesEXT",
-   "glGenTexturesEXT",
-   "glIsTextureEXT",
-   "glPrioritizeTexturesEXT",
-   "-GL_SGIS_detail_texture",
-   "glDetailTexFuncSGIS",
-   "glGetDetailTexFuncSGIS",
-   "-GL_SGIS_sharpen_texture",
-   "glSharpenTexFuncSGIS",
-   "glGetSharpenTexFuncSGIS",
-   "-GL_SGIS_multisample",
-   "glSampleMaskSGIS",
-   "glSamplePatternSGIS",
-   "-GL_EXT_vertex_array",
-   "glArrayElementEXT",
-   "glColorPointerEXT",
-   "glDrawArraysEXT",
-   "glEdgeFlagPointerEXT",
-   "glGetPointervEXT",
-   "glIndexPointerEXT",
-   "glNormalPointerEXT",
-   "glTexCoordPointerEXT",
-   "glVertexPointerEXT",
-   "-GL_EXT_blend_minmax",
-   "glBlendEquationEXT",
-   "-GL_SGIX_sprite",
-   "glSpriteParameterfSGIX",
-   "glSpriteParameterfvSGIX",
-   "glSpriteParameteriSGIX",
-   "glSpriteParameterivSGIX",
-   "-GL_ARB_point_parameters",
-   "glPointParameterfARB",
-   "glPointParameterfvARB",
-   "-GL_EXT_point_parameters",
-   "glPointParameterfEXT",
-   "glPointParameterfvEXT",
-   "-GL_SGIS_point_parameters",
-   "glPointParameterfSGIS",
-   "glPointParameterfvSGIS",
-   "-GL_SGIX_instruments",
-   "glGetInstrumentsSGIX",
-   "glInstrumentsBufferSGIX",
-   "glPollInstrumentsSGIX",
-   "glReadInstrumentsSGIX",
-   "glStartInstrumentsSGIX",
-   "glStopInstrumentsSGIX",
-   "-GL_SGIX_framezoom",
-   "glFrameZoomSGIX",
-   "-GL_SGIX_tag_sample_buffer",
-   "glTagSampleBufferSGIX",
-   "-GL_SGIX_polynomial_ffd",
-   "glDeformationMap3dSGIX",
-   "glDeformationMap3fSGIX",
-   "glDeformSGIX",
-   "glLoadIdentityDeformationMapSGIX",
-   "-GL_SGIX_reference_plane",
-   "glReferencePlaneSGIX",
-   "-GL_SGIX_flush_raster",
-   "glFlushRasterSGIX",
-   "-GL_SGIS_fog_function",
-   "glFogFuncSGIS",
-   "glGetFogFuncSGIS",
-   "-GL_HP_image_transform",
-   "glImageTransformParameteriHP",
-   "glImageTransformParameterfHP",
-   "glImageTransformParameterivHP",
-   "glImageTransformParameterfvHP",
-   "glGetImageTransformParameterivHP",
-   "glGetImageTransformParameterfvHP",
-   "-GL_EXT_color_subtable",
-   "glColorSubTableEXT",
-   "glCopyColorSubTableEXT",
-   "-GL_PGI_misc_hints",
-   "glHintPGI",
-   "-GL_EXT_paletted_texture",
-   "glColorTableEXT",
-   "glGetColorTableEXT",
-   "glGetColorTableParameterivEXT",
-   "glGetColorTableParameterfvEXT",
-   "-GL_SGIX_list_priority",
-   "glGetListParameterfvSGIX",
-   "glGetListParameterivSGIX",
-   "glListParameterfSGIX",
-   "glListParameterfvSGIX",
-   "glListParameteriSGIX",
-   "glListParameterivSGIX",
-   "-GL_EXT_index_material",
-   "glIndexMaterialEXT",
-   "-GL_EXT_index_func",
-   "glIndexFuncEXT",
-   "-GL_EXT_compiled_vertex_array",
-   "glLockArraysEXT",
-   "glUnlockArraysEXT",
-   "-GL_EXT_cull_vertex",
-   "glCullParameterdvEXT",
-   "glCullParameterfvEXT",
-   "-GL_SGIX_fragment_lighting",
-   "glFragmentColorMaterialSGIX",
-   "glFragmentLightfSGIX",
-   "glFragmentLightfvSGIX",
-   "glFragmentLightiSGIX",
-   "glFragmentLightivSGIX",
-   "glFragmentLightModelfSGIX",
-   "glFragmentLightModelfvSGIX",
-   "glFragmentLightModeliSGIX",
-   "glFragmentLightModelivSGIX",
-   "glFragmentMaterialfSGIX",
-   "glFragmentMaterialfvSGIX",
-   "glFragmentMaterialiSGIX",
-   "glFragmentMaterialivSGIX",
-   "glGetFragmentLightfvSGIX",
-   "glGetFragmentLightivSGIX",
-   "glGetFragmentMaterialfvSGIX",
-   "glGetFragmentMaterialivSGIX",
-   "glLightEnviSGIX",
-   "-GL_EXT_draw_range_elements",
-   "glDrawRangeElementsEXT",
-   "-GL_EXT_light_texture",
-   "glApplyTextureEXT",
-   "glTextureLightEXT",
-   "glTextureMaterialEXT",
-   "-GL_SGIX_async",
-   "glAsyncMarkerSGIX",
-   "glFinishAsyncSGIX",
-   "glPollAsyncSGIX",
-   "glGenAsyncMarkersSGIX",
-   "glDeleteAsyncMarkersSGIX",
-   "glIsAsyncMarkerSGIX",
-   "-GL_INTEL_parallel_arrays",
-   "glVertexPointervINTEL",
-   "glNormalPointervINTEL",
-   "glColorPointervINTEL",
-   "glTexCoordPointervINTEL",
-   "-GL_EXT_pixel_transform",
-   "glPixelTransformParameteriEXT",
-   "glPixelTransformParameterfEXT",
-   "glPixelTransformParameterivEXT",
-   "glPixelTransformParameterfvEXT",
-   "-GL_EXT_secondary_color",
-   "glSecondaryColor3bEXT",
-   "glSecondaryColor3bvEXT",
-   "glSecondaryColor3dEXT",
-   "glSecondaryColor3dvEXT",
-   "glSecondaryColor3fEXT",
-   "glSecondaryColor3fvEXT",
-   "glSecondaryColor3iEXT",
-   "glSecondaryColor3ivEXT",
-   "glSecondaryColor3sEXT",
-   "glSecondaryColor3svEXT",
-   "glSecondaryColor3ubEXT",
-   "glSecondaryColor3ubvEXT",
-   "glSecondaryColor3uiEXT",
-   "glSecondaryColor3uivEXT",
-   "glSecondaryColor3usEXT",
-   "glSecondaryColor3usvEXT",
-   "glSecondaryColorPointerEXT",
-   "-GL_EXT_texture_perturb_normal",
-   "glTextureNormalEXT",
-   "-GL_EXT_multi_draw_arrays",
-   "glMultiDrawArraysEXT",
-   "glMultiDrawElementsEXT",
-   "-GL_EXT_fog_coord",
-   "glFogCoordfEXT",
-   "glFogCoordfvEXT",
-   "glFogCoorddEXT",
-   "glFogCoorddvEXT",
-   "glFogCoordPointerEXT",
-   "-GL_EXT_coordinate_frame",
-   "glTangent3bEXT",
-   "glTangent3bvEXT",
-   "glTangent3dEXT",
-   "glTangent3dvEXT",
-   "glTangent3fEXT",
-   "glTangent3fvEXT",
-   "glTangent3iEXT",
-   "glTangent3ivEXT",
-   "glTangent3sEXT",
-   "glTangent3svEXT",
-   "glBinormal3bEXT",
-   "glBinormal3bvEXT",
-   "glBinormal3dEXT",
-   "glBinormal3dvEXT",
-   "glBinormal3fEXT",
-   "glBinormal3fvEXT",
-   "glBinormal3iEXT",
-   "glBinormal3ivEXT",
-   "glBinormal3sEXT",
-   "glBinormal3svEXT",
-   "glTangentPointerEXT",
-   "glBinormalPointerEXT",
-   "-GL_SUNX_constant_data",
-   "glFinishTextureSUNX",
-   "-GL_SUN_global_alpha",
-   "glGlobalAlphaFactorbSUN",
-   "glGlobalAlphaFactorsSUN",
-   "glGlobalAlphaFactoriSUN",
-   "glGlobalAlphaFactorfSUN",
-   "glGlobalAlphaFactordSUN",
-   "glGlobalAlphaFactorubSUN",
-   "glGlobalAlphaFactorusSUN",
-   "glGlobalAlphaFactoruiSUN",
-   "-GL_SUN_triangle_list",
-   "glReplacementCodeuiSUN",
-   "glReplacementCodeusSUN",
-   "glReplacementCodeubSUN",
-   "glReplacementCodeuivSUN",
-   "glReplacementCodeusvSUN",
-   "glReplacementCodeubvSUN",
-   "glReplacementCodePointerSUN",
-   "-GL_SUN_vertex",
-   "glColor4ubVertex2fSUN",
-   "glColor4ubVertex2fvSUN",
-   "glColor4ubVertex3fSUN",
-   "glColor4ubVertex3fvSUN",
-   "glColor3fVertex3fSUN",
-   "glColor3fVertex3fvSUN",
-   "glNormal3fVertex3fSUN",
-   "glNormal3fVertex3fvSUN",
-   "glColor4fNormal3fVertex3fSUN",
-   "glColor4fNormal3fVertex3fvSUN",
-   "glTexCoord2fVertex3fSUN",
-   "glTexCoord2fVertex3fvSUN",
-   "glTexCoord4fVertex4fSUN",
-   "glTexCoord4fVertex4fvSUN",
-   "glTexCoord2fColor4ubVertex3fSUN",
-   "glTexCoord2fColor4ubVertex3fvSUN",
-   "glTexCoord2fColor3fVertex3fSUN",
-   "glTexCoord2fColor3fVertex3fvSUN",
-   "glTexCoord2fNormal3fVertex3fSUN",
-   "glTexCoord2fNormal3fVertex3fvSUN",
-   "glTexCoord2fColor4fNormal3fVertex3fSUN",
-   "glTexCoord2fColor4fNormal3fVertex3fvSUN",
-   "glTexCoord4fColor4fNormal3fVertex4fSUN",
-   "glTexCoord4fColor4fNormal3fVertex4fvSUN",
-   "glReplacementCodeuiVertex3fSUN",
-   "glReplacementCodeuiVertex3fvSUN",
-   "glReplacementCodeuiColor4ubVertex3fSUN",
-   "glReplacementCodeuiColor4ubVertex3fvSUN",
-   "glReplacementCodeuiColor3fVertex3fSUN",
-   "glReplacementCodeuiColor3fVertex3fvSUN",
-   "glReplacementCodeuiNormal3fVertex3fSUN",
-   "glReplacementCodeuiNormal3fVertex3fvSUN",
-   "glReplacementCodeuiColor4fNormal3fVertex3fSUN",
-   "glReplacementCodeuiColor4fNormal3fVertex3fvSUN",
-   "glReplacementCodeuiTexCoord2fVertex3fSUN",
-   "glReplacementCodeuiTexCoord2fVertex3fvSUN",
-   "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN",
-   "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN",
-   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN",
-   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN",
-   "-GL_EXT_blend_func_separate",
-   "glBlendFuncSeparateEXT",
-   "glBlendFuncSeparateINGR",
-   "-GL_EXT_vertex_weighting",
-   "glVertexWeightfEXT",
-   "glVertexWeightfvEXT",
-   "glVertexWeightPointerEXT",
-   "-GL_NV_vertex_array_range",
-   "glFlushVertexArrayRangeNV",
-   "glVertexArrayRangeNV",
-   "-GL_NV_register_combiners",
-   "glCombinerParameterfvNV",
-   "glCombinerParameterfNV",
-   "glCombinerParameterivNV",
-   "glCombinerParameteriNV",
-   "glCombinerInputNV",
-   "glCombinerOutputNV",
-   "glFinalCombinerInputNV",
-   "glGetCombinerInputParameterfvNV",
-   "glGetCombinerInputParameterivNV",
-   "glGetCombinerOutputParameterfvNV",
-   "glGetCombinerOutputParameterivNV",
-   "glGetFinalCombinerInputParameterfvNV",
-   "glGetFinalCombinerInputParameterivNV",
-   "-GL_MESA_resize_buffers",
-   "glResizeBuffersMESA",
-   "-GL_MESA_window_pos",
-   "glWindowPos2dMESA",
-   "glWindowPos2dvMESA",
-   "glWindowPos2fMESA",
-   "glWindowPos2fvMESA",
-   "glWindowPos2iMESA",
-   "glWindowPos2ivMESA",
-   "glWindowPos2sMESA",
-   "glWindowPos2svMESA",
-   "glWindowPos3dMESA",
-   "glWindowPos3dvMESA",
-   "glWindowPos3fMESA",
-   "glWindowPos3fvMESA",
-   "glWindowPos3iMESA",
-   "glWindowPos3ivMESA",
-   "glWindowPos3sMESA",
-   "glWindowPos3svMESA",
-   "glWindowPos4dMESA",
-   "glWindowPos4dvMESA",
-   "glWindowPos4fMESA",
-   "glWindowPos4fvMESA",
-   "glWindowPos4iMESA",
-   "glWindowPos4ivMESA",
-   "glWindowPos4sMESA",
-   "glWindowPos4svMESA",
-   "-GL_IBM_multimode_draw_arrays",
-   "glMultiModeDrawArraysIBM",
-   "glMultiModeDrawElementsIBM",
-   "-GL_IBM_vertex_array_lists",
-   "glColorPointerListIBM",
-   "glSecondaryColorPointerListIBM",
-   "glEdgeFlagPointerListIBM",
-   "glFogCoordPointerListIBM",
-   "glIndexPointerListIBM",
-   "glNormalPointerListIBM",
-   "glTexCoordPointerListIBM",
-   "glVertexPointerListIBM",
-   "-GL_3DFX_tbuffer",
-   "glTbufferMask3DFX",
-   "-GL_EXT_multisample",
-   "glSampleMaskEXT",
-   "glSamplePatternEXT",
-   "-GL_SGIS_texture_color_mask",
-   "glTextureColorMaskSGIS",
-   "-GL_SGIX_igloo_interface",
-   "glIglooInterfaceSGIX",
-   "-GL_NV_fence",
-   "glGenFencesNV",
-   "glDeleteFencesNV",
-   "glSetFenceNV",
-   "glTestFenceNV",
-   "glFinishFenceNV",
-   "glIsFenceNV",
-   "glGetFenceivNV",
-   "-GL_NV_evaluators",
-   "glMapControlPointsNV",
-   "glMapParameterivNV",
-   "glMapParameterfvNV",
-   "glGetMapControlPointsNV",
-   "glGetMapParameterivNV",
-   "glGetMapParameterfvNV",
-   "glGetMapAttribParameterivNV",
-   "glGetMapAttribParameterfvNV",
-   "glEvalMapsNV",
-   "-GL_NV_register_combiners2",
-   "glCombinerStageParameterfvNV",
-   "glGetCombinerStageParameterfvNV",
-   "-GL_NV_vertex_program",
-   "glBindProgramNV",
-   "glDeleteProgramsNV",
-   "glExecuteProgramNV",
-   "glGenProgramsNV",
-   "glAreProgramsResidentNV",
-   "glRequestResidentProgramsNV",
-   "glGetProgramParameterfvNV",
-   "glGetProgramParameterdvNV",
-   "glGetProgramivNV",
-   "glGetProgramStringNV",
-   "glGetTrackMatrixivNV",
-   "glGetVertexAttribdvNV",
-   "glGetVertexAttribfvNV",
-   "glGetVertexAttribivNV",
-   "glGetVertexAttribPointervNV",
-   "glIsProgramNV",
-   "glLoadProgramNV",
-   "glProgramParameter4fNV",
-   "glProgramParameter4dNV",
-   "glProgramParameter4dvNV",
-   "glProgramParameter4fvNV",
-   "glProgramParameters4dvNV",
-   "glProgramParameters4fvNV",
-   "glTrackMatrixNV",
-   "glVertexAttribPointerNV",
-   "glVertexAttrib1sNV",
-   "glVertexAttrib1fNV",
-   "glVertexAttrib1dNV",
-   "glVertexAttrib2sNV",
-   "glVertexAttrib2fNV",
-   "glVertexAttrib2dNV",
-   "glVertexAttrib3sNV",
-   "glVertexAttrib3fNV",
-   "glVertexAttrib3dNV",
-   "glVertexAttrib4sNV",
-   "glVertexAttrib4fNV",
-   "glVertexAttrib4dNV",
-   "glVertexAttrib4ubNV",
-   "glVertexAttrib1svNV",
-   "glVertexAttrib1fvNV",
-   "glVertexAttrib1dvNV",
-   "glVertexAttrib2svNV",
-   "glVertexAttrib2fvNV",
-   "glVertexAttrib2dvNV",
-   "glVertexAttrib3svNV",
-   "glVertexAttrib3fvNV",
-   "glVertexAttrib3dvNV",
-   "glVertexAttrib4svNV",
-   "glVertexAttrib4fvNV",
-   "glVertexAttrib4dvNV",
-   "glVertexAttrib4ubvNV",
-   "glVertexAttribs1svNV",
-   "glVertexAttribs1fvNV",
-   "glVertexAttribs1dvNV",
-   "glVertexAttribs2svNV",
-   "glVertexAttribs2fvNV",
-   "glVertexAttribs2dvNV",
-   "glVertexAttribs3svNV",
-   "glVertexAttribs3fvNV",
-   "glVertexAttribs3dvNV",
-   "glVertexAttribs4svNV",
-   "glVertexAttribs4fvNV",
-   "glVertexAttribs4dvNV",
-   "glVertexAttribs4ubvNV",
-   "-GL_ARB_window_pos",
-   "glWindowPos2dARB",
-   "glWindowPos2fARB",
-   "glWindowPos2iARB",
-   "glWindowPos2sARB",
-   "glWindowPos2dvARB",
-   "glWindowPos2fvARB",
-   "glWindowPos2ivARB",
-   "glWindowPos2svARB",
-   "glWindowPos3dARB",
-   "glWindowPos3fARB",
-   "glWindowPos3iARB",
-   "glWindowPos3sARB",
-   "glWindowPos3dvARB",
-   "glWindowPos3fvARB",
-   "glWindowPos3ivARB",
-   "glWindowPos3svARB",
-   "-EXT_stencil_two_side",
-   "glActiveStencilFaceEXT",
-
-   NULL
-};
+
+
+static GLboolean
+test_ActiveTextureARB(generic_func func)
+{
+   PFNGLACTIVETEXTUREARBPROC activeTexture = (PFNGLACTIVETEXTUREARBPROC) func;
+   GLint t;
+   GLboolean pass;
+   (*activeTexture)(GL_TEXTURE1_ARB);
+   glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &t);
+   pass = (t == GL_TEXTURE1_ARB);
+   (*activeTexture)(GL_TEXTURE0_ARB);  /* restore default */
+   return pass;
+}
+
+
+static GLboolean
+test_SecondaryColor3fEXT(generic_func func)
+{
+   PFNGLSECONDARYCOLOR3FEXTPROC secColor3f = (PFNGLSECONDARYCOLOR3FEXTPROC) func;
+   GLfloat color[4];
+   GLboolean pass;
+   (*secColor3f)(1.0, 1.0, 0.0);
+   glGetFloatv(GL_CURRENT_SECONDARY_COLOR_EXT, color);
+   pass = (color[0] == 1.0 && color[1] == 1.0 && color[2] == 0.0);
+   (*secColor3f)(0.0, 0.0, 0.0);  /* restore default */
+   return pass;
+}
+
+
+static GLboolean
+test_ActiveStencilFaceEXT(generic_func func)
+{
+   PFNGLACTIVESTENCILFACEEXTPROC activeFace = (PFNGLACTIVESTENCILFACEEXTPROC) func;
+   GLint face;
+   GLboolean pass;
+   (*activeFace)(GL_BACK);
+   glGetIntegerv(GL_ACTIVE_STENCIL_FACE_EXT, &face);
+   pass = (face == GL_BACK);
+   (*activeFace)(GL_FRONT);  /* restore default */
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib1fvARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB1FVARBPROC vertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLfloat v[1] = {25.0};
+   const GLfloat def[1] = {0};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib1fvARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (res[0] == 25.0 && res[1] == 0.0 && res[2] == 0.0 && res[3] == 1.0);
+   (*vertexAttrib1fvARB)(6, def);
+   return pass;
+}
+
+static GLboolean
+test_VertexAttrib4NubvARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB4NUBVARBPROC vertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLubyte v[4] = {255, 0, 255, 0};
+   const GLubyte def[4] = {0, 0, 0, 255};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4NubvARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (res[0] == 1.0 && res[1] == 0.0 && res[2] == 1.0 && res[3] == 0.0);
+   (*vertexAttrib4NubvARB)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4NuivARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB4NUIVARBPROC vertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLuint v[4] = {0xffffffff, 0, 0xffffffff, 0};
+   const GLuint def[4] = {0, 0, 0, 0xffffffff};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4NuivARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (EQUAL(res[0], 1.0) && EQUAL(res[1], 0.0) && EQUAL(res[2], 1.0) && EQUAL(res[3], 0.0));
+   (*vertexAttrib4NuivARB)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4ivARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB4IVARBPROC vertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLint v[4] = {1, 2, -3, 4};
+   const GLint def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4ivARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (EQUAL(res[0], 1.0) && EQUAL(res[1], 2.0) && EQUAL(res[2], -3.0) && EQUAL(res[3], 4.0));
+   (*vertexAttrib4ivARB)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4NsvARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB4NSVARBPROC vertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLshort v[4] = {0, 32767, 32767, 0};
+   const GLshort def[4] = {0, 0, 0, 32767};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4NsvARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (EQUAL(res[0], 0.0) && EQUAL(res[1], 1.0) && EQUAL(res[2], 1.0) && EQUAL(res[3], 0.0));
+   (*vertexAttrib4NsvARB)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4NusvARB(generic_func func)
+{
+   PFNGLVERTEXATTRIB4NUSVARBPROC vertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) func;
+   PFNGLGETVERTEXATTRIBFVARBPROC getVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvARB");
+
+   const GLushort v[4] = {0xffff, 0, 0xffff, 0};
+   const GLushort def[4] = {0, 0, 0, 0xffff};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4NusvARB)(6, v);
+   (*getVertexAttribfvARB)(6, GL_CURRENT_VERTEX_ATTRIB_ARB, res);
+   pass = (EQUAL(res[0], 1.0) && EQUAL(res[1], 0.0) && EQUAL(res[2], 1.0) && EQUAL(res[3], 0.0));
+   (*vertexAttrib4NusvARB)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4ubNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4UBNVPROC vertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLubyte v[4] = {255, 0, 255, 0};
+   const GLubyte def[4] = {0, 0, 0, 255};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4ubNV)(6, v[0], v[1], v[2], v[3]);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   pass = (res[0] == 1.0 && res[1] == 0.0 && res[2] == 1.0 && res[3] == 0.0);
+   (*vertexAttrib4ubNV)(6, def[0], def[1], def[2], def[3]);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib2sNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB2SNVPROC vertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLshort v[2] = {2, -4,};
+   const GLshort def[2] = {0, 0};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib2sNV)(6, v[0], v[1]);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   pass = (EQUAL(res[0], 2) && EQUAL(res[1], -4) && EQUAL(res[2], 0) && res[3] == 1.0);
+   (*vertexAttrib2sNV)(6, def[0], def[1]);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib3fNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB3FNVPROC vertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLfloat v[3] = {0.2, 0.4, 0.8};
+   const GLfloat def[3] = {0, 0, 0};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib3fNV)(6, v[0], v[1], v[2]);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   pass = (EQUAL(res[0], 0.2) && EQUAL(res[1], 0.4) && EQUAL(res[2], 0.8) && res[3] == 1.0);
+   (*vertexAttrib3fNV)(6, def[0], def[1], def[2]);
+   return pass;
+}
+
+
+static GLboolean
+test_VertexAttrib4dvNV(generic_func func)
+{
+   PFNGLVERTEXATTRIB4DVNVPROC vertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) func;
+   PFNGLGETVERTEXATTRIBFVNVPROC getVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) glXGetProcAddressARB((const GLubyte *) "glGetVertexAttribfvNV");
+
+   const GLdouble v[4] = {0.2, 0.4, 0.8, 1.2};
+   const GLdouble def[4] = {0, 0, 0, 1};
+   GLfloat res[4];
+   GLboolean pass;
+   (*vertexAttrib4dvNV)(6, v);
+   (*getVertexAttribfvNV)(6, GL_CURRENT_ATTRIB_NV, res);
+   pass = (EQUAL(res[0], 0.2) && EQUAL(res[1], 0.4) && EQUAL(res[2], 0.8) && EQUAL(res[3], 1.2));
+   (*vertexAttrib4dvNV)(6, def);
+   return pass;
+}
+
+
+static GLboolean
+test_StencilFuncSeparateATI(generic_func func)
+{
+#ifdef GL_ATI_separate_stencil
+   PFNGLSTENCILFUNCSEPARATEATIPROC stencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC) func;
+   GLint frontFunc, backFunc;
+   GLint frontRef, backRef;
+   GLint frontMask, backMask;
+   (*stencilFuncSeparateATI)(GL_LESS, GL_GREATER, 2, 0xa);
+   glGetIntegerv(GL_STENCIL_FUNC, &frontFunc);
+   glGetIntegerv(GL_STENCIL_BACK_FUNC, &backFunc);
+   glGetIntegerv(GL_STENCIL_REF, &frontRef);
+   glGetIntegerv(GL_STENCIL_BACK_REF, &backRef);
+   glGetIntegerv(GL_STENCIL_VALUE_MASK, &frontMask);
+   glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK, &backMask);
+   if (frontFunc != GL_LESS ||
+       backFunc != GL_GREATER ||
+       frontRef != 2 ||
+       backRef != 2 ||
+       frontMask != 0xa ||
+       backMask != 0xa)
+      return GL_FALSE;
+#endif
+   return GL_TRUE;
+}
+
+static GLboolean
+test_StencilFuncSeparate(generic_func func)
+{
+#ifdef GL_VERSION_2_0
+   PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) func;
+   GLint frontFunc, backFunc;
+   GLint frontRef, backRef;
+   GLint frontMask, backMask;
+   (*stencilFuncSeparate)(GL_BACK, GL_GREATER, 2, 0xa);
+   glGetIntegerv(GL_STENCIL_FUNC, &frontFunc);
+   glGetIntegerv(GL_STENCIL_BACK_FUNC, &backFunc);
+   glGetIntegerv(GL_STENCIL_REF, &frontRef);
+   glGetIntegerv(GL_STENCIL_BACK_REF, &backRef);
+   glGetIntegerv(GL_STENCIL_VALUE_MASK, &frontMask);
+   glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK, &backMask);
+   if (frontFunc != GL_ALWAYS ||
+       backFunc != GL_GREATER ||
+       frontRef != 0 ||
+       backRef != 2 ||
+       frontMask == 0xa || /* might be 0xff or ~0 */
+       backMask != 0xa)
+      return GL_FALSE;
+#endif
+   return GL_TRUE;
+}
+
+static GLboolean
+test_StencilOpSeparate(generic_func func)
+{
+#ifdef GL_VERSION_2_0
+   PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) func;
+   GLint frontFail, backFail;
+   GLint frontZFail, backZFail;
+   GLint frontZPass, backZPass;
+   (*stencilOpSeparate)(GL_BACK, GL_INCR, GL_DECR, GL_INVERT);
+   glGetIntegerv(GL_STENCIL_FAIL, &frontFail);
+   glGetIntegerv(GL_STENCIL_BACK_FAIL, &backFail);
+   glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &frontZFail);
+   glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL, &backZFail);
+   glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &frontZPass);
+   glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS, &backZPass);
+   if (frontFail != GL_KEEP ||
+       backFail != GL_INCR ||
+       frontZFail != GL_KEEP ||
+       backZFail != GL_DECR ||
+       frontZPass != GL_KEEP ||
+       backZPass != GL_INVERT)
+      return GL_FALSE;
+#endif
+   return GL_TRUE;
+}
+
+static GLboolean
+test_StencilMaskSeparate(generic_func func)
+{
+#ifdef GL_VERSION_2_0
+   PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) func;
+   GLint frontMask, backMask;
+   (*stencilMaskSeparate)(GL_BACK, 0x1b);
+   glGetIntegerv(GL_STENCIL_WRITEMASK, &frontMask);
+   glGetIntegerv(GL_STENCIL_BACK_WRITEMASK, &backMask);
+   if (frontMask == 0x1b ||
+       backMask != 0x1b)
+      return GL_FALSE;
+#endif
+   return GL_TRUE;
+}
+
+
+/*
+ * The following file is auto-generated with Python.
+ */
+#include "getproclist.h"
+
 
 
 static int
 extension_supported(const char *haystack, const char *needle)
 {
-   if (strstr(haystack, needle))
-      return 1;
+   const char *p = strstr(haystack, needle);
+   if (p) {
+      /* found string, make sure next char is space or zero */
+      const int len = strlen(needle);
+      if (p[len] == ' ' || p[len] == 0)
+         return 1;
+      else
+         return 0;
+   }
    else
       return 0;
 }
 
 
 static void
-test_functions( const char *extensions )
+check_functions( const char *extensions )
 {
+   struct name_test_pair *entry;
    int failures = 0, passes = 0;
+   int totalFail = 0, totalPass = 0;
    int doTests;
-   int i;
 
-   for (i = 0; functions[i]; i++) {
-      if (functions[i][0] == '-') {
-         if (functions[i][1] == '1') {
-            doTests = 1;
+   for (entry = functions; entry->name; entry++) {
+      if (entry->name[0] == '-') {
+         const char *version = (const char *) glGetString(GL_VERSION);
+         if (entry->name[1] == '1') {
+            /* check GL version 1.x */
+            if (version[0] == '1' &&
+                version[1] == '.' &&
+                version[2] >= entry->name[3])
+               doTests = 1;
+            else
+               doTests = 0;
+         }
+         else if (entry->name[1] == '2') {
+            if (version[0] == '2' &&
+                version[1] == '.' &&
+                version[2] >= entry->name[3])
+               doTests = 1;
+            else
+               doTests = 0;
          }
          else {
             /* check if the named extension is available */
-            doTests = extension_supported(extensions, functions[i]+1);
+            doTests = extension_supported(extensions, entry->name+1);
          }
          if (doTests)
-            printf("Testing %s functions\n", functions[i] + 1);
+            printf("Testing %s functions\n", entry->name + 1);
+         totalFail += failures;
+         totalPass += passes;
          failures = 0;
          passes = 0;
       }
       else if (doTests) {
-         void *p = (void *) glXGetProcAddressARB((const GLubyte *) functions[i]);
-         if (p) {
-            passes++;
+         generic_func funcPtr = (generic_func) glXGetProcAddressARB((const GLubyte *) entry->name);
+         if (funcPtr) {
+            if (entry->test) {
+               GLboolean b;
+               printf("   Validating %s:", entry->name);
+               b = (*entry->test)(funcPtr);
+               if (b) {
+                  printf(" Pass\n");
+                  passes++;
+               }
+               else {
+                  printf(" FAIL!!!\n");
+                  failures++;
+               }
+            }
+            else {
+               passes++;
+            }
          }
          else {
-            printf("   glXGetProcAddress(%s) failed!\n", functions[i]);
+            printf("   glXGetProcAddress(%s) failed!\n", entry->name);
             failures++;
          }
       }
 
-      if (doTests && (!functions[i + 1] || functions[i + 1][0] == '-')) {
+      if (doTests && (!(entry+1)->name || (entry+1)->name[0] == '-')) {
          if (failures > 0) {
-            printf("   %d failures\n", failures);
+            printf("   %d failed.\n", failures);
          }
-         else if (i > 0) {
+         if (passes > 0) {
             printf("   %d passed.\n", passes);
          }
       }
    }
+   totalFail += failures;
+   totalPass += passes;
+
+   printf("-----------------------------\n");
+   printf("Total: %d pass  %d fail\n", totalPass, totalFail);
 }
 
 
@@ -1096,12 +479,14 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
       GLX_RED_SIZE, 1,
       GLX_GREEN_SIZE, 1,
       GLX_BLUE_SIZE, 1,
+      GLX_STENCIL_SIZE, 1,
       None };
    int attribDouble[] = {
       GLX_RGBA,
       GLX_RED_SIZE, 1,
       GLX_GREEN_SIZE, 1,
       GLX_BLUE_SIZE, 1,
+      GLX_STENCIL_SIZE, 1,
       GLX_DOUBLEBUFFER,
       None };
 
@@ -1140,7 +525,7 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect)
    }
 
    if (glXMakeCurrent(dpy, win, ctx)) {
-      test_functions( (const char *) glGetString(GL_EXTENSIONS) );
+      check_functions( (const char *) glGetString(GL_EXTENSIONS) );
    }
    else {
       fprintf(stderr, "Error: glXMakeCurrent failed\n");