X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=progs%2Ftests%2Fgetprocaddress.c;h=ca66025d2dcc19a919018ac71b1a892ddca32a89;hb=7ead1c5d061b86027cb5e821fdcaa9cdce1d9537;hp=e80b9dbab36151227420ee2918c804cb52b8759f;hpb=7c5282d2a8bb6b4c8d265ad3fc1a1652c55df167;p=mesa.git diff --git a/progs/tests/getprocaddress.c b/progs/tests/getprocaddress.c index e80b9dbab36..ca66025d2dc 100644 --- a/progs/tests/getprocaddress.c +++ b/progs/tests/getprocaddress.c @@ -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"), @@ -34,1055 +32,440 @@ #include #include #include +#include + + +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");