-/* $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);
}
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 };
}
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");